我不确定这是否可以实现,但这里......:)
让我们假设两个模型,Page
模型和Field
模型。 Page has_many :fields
和Field
模型有两个属性::name, :value
我想要实现的是Page
模型,为每个返回Field#name
的{{1}}动态定义实例方法。
因此,如果我的页面有一个名为“foobar”的字段,我会动态创建一个这样的方法:
Field#value
这可以实现吗?如果有,请帮忙吗?
对于红宝石......
答案 0 :(得分:1)
您可以覆盖method_missing以实现目标:
def method_missing(method, *args, &block)
super
rescue NoMethodError => e
field = fields.find_by_name(method)
raise e unless field
field.value
end
可能最好在动态方法中添加前缀或后缀,例如:
def method_missing(method, *args, &block)
if method.starts_with?('value_of_')
name = method.sub('value_of_', '')
field = fields.find_by_name(method)
field && field.value
else
super
end
end
并称之为:
page.value_of_foobar