实例对象中的 ActiveModel 动态方法
我在我的一个项目中使用 ActiveModel,我想问在下一种情况下定义动态方法的最佳方式是什么
Base ActiveModel 类只有 1 个称为属性的访问器属性。
def initialize(attributes = {})
set_default_attributes!
@attributes.merge!(attributes.symbolize_keys)
@new_record = true
end
def read_attribute_for_validation(key)
@attributes[key]
end
def self.create(attributes={})
obj = self.new(attributes)
obj.save
return obj
end
def save
if self.valid?
puts "saved!"
return true
end
return false
end
def update_attributes(attributes={})
self.attributes.merge!(attributes.symbolize_keys)
self.save
end
def as_json(options={})
hash = Hash.new
hash.merge!(self.attributes)
hash.as_json({:root=>false}.merge!(options || {}))
end
方法应该类似于访问器,但应该使用内部 @attributes 变量
如果 @attributes
是像 {:param1=>1,:param2=>2}
实例对象 这样的哈希值,则示例应该有下一个方法,
param1
param1=
param2
param2=
我尝试使用缺少的方法,但如果方法以“=”结束,我需要解析它并检查此类键的属性,所以我不喜欢代码的样子。
I'm using ActiveModel in one of my projects and I wanted to ask what is the best way for dynamic methods defining in next situation
Base ActiveModel class has only 1 accessor attribute called attributes.
def initialize(attributes = {})
set_default_attributes!
@attributes.merge!(attributes.symbolize_keys)
@new_record = true
end
def read_attribute_for_validation(key)
@attributes[key]
end
def self.create(attributes={})
obj = self.new(attributes)
obj.save
return obj
end
def save
if self.valid?
puts "saved!"
return true
end
return false
end
def update_attributes(attributes={})
self.attributes.merge!(attributes.symbolize_keys)
self.save
end
def as_json(options={})
hash = Hash.new
hash.merge!(self.attributes)
hash.as_json({:root=>false}.merge!(options || {}))
end
methods should be like accessors but should use internal @attributes variable
Example if @attributes
is hash like {:param1=>1,:param2=>2}
instance object should have next methods
param1
param1=
param2
param2=
I tried to use method missing but if method finished with "=" I need to parse it and check attributes for such key so I don't like how code looks like.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 singleton_class.module_eval 添加方法
you can add methods with singleton_class.module_eval