zig*_*mir 10 ruby ruby-on-rails activemodel ruby-on-rails-3
如何获取ActiveRecord属性方法功能?我有这门课:
class PurchaseForm
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :name,
:surname,
:email
validates_presence_of :name
validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
def initialize(attributes = {}, shop_name)
if not attributes.nil?
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
Run Code Online (Sandbox Code Playgroud)
我需要做什么,有一个属性方法列出来自PurchaseForm对象的所有名称和值?
Rus*_*nov 14
这是重构的变体:
class PurchaseForm
include ActiveModel::Model
def self.attributes
[:name, :surname, :email]
end
attr_accessor *self.attributes
# your validations
def to_hash
self.class.attributes.inject({}) do |hash, key|
hash.merge({ key => self.send(key) })
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在您可以轻松使用此类:
irb(main):001:0> a = PurchaseForm.new({ name: 'Name' })
=> #<PurchaseForm:0x00000002606b50 @name="Name">
irb(main):002:0> a.to_hash
=> {:name=>"Name", :surname=>nil, :email=>nil}
irb(main):003:0> a.email = 'user@example.com'
=> "user@example.com"
irb(main):004:0> a
=> #<PurchaseForm:0x00000002606b50 @name="Name", @email="user@example.com">
irb(main):005:0> a.to_hash
=> {:name=>"Name", :surname=>nil, :email=>"user@example.com"}
Run Code Online (Sandbox Code Playgroud)
更重要的是,如果要使此行为可重用,请考虑将提取.attributes和#to_hash方法分离到单独的模块中:
module AttributesHash
extend ActiveSupport::Concern
class_methods do
def attr_accessor(*args)
@attributes = args
super(*args)
end
def attributes
@attributes
end
end
included do
def to_hash
self.class.attributes.inject({}) do |hash, key|
hash.merge({ key => self.send(key) })
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,只需将它包含在您的模型中即可完成:
class PurchaseForm
include ActiveModel::Model
include AttributesHash
attr_accessor :name, :surname, :email
# your validations
end
Run Code Online (Sandbox Code Playgroud)
Ale*_*zov 11
#instance_values 可以做的工作:
class PurchaseForm
attr_accessor :name, :email
def attributes
instance_values
end
end
Run Code Online (Sandbox Code Playgroud)
输出样本:
purchase.attributes #=> {"name"=>"John", "email"=>"john@example.com"}
Run Code Online (Sandbox Code Playgroud)
我设法解决了这段代码的问题:
class PurchaseForm
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :attributes,
:name,
:surname,
:email
validates_presence_of :name
validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
def initialize(attributes = {})
@attributes = attributes
end
def persisted?
false
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10108 次 |
| 最近记录: |