3

我不确定这是否可以实现,但这里是...... :)

让我们假设两个模型,一个Page模型和一个Field模型。APage has_many :fieldsField模型有两个属性::name, :value

我想要实现的是在Page模型中为每个Field#name返回的Field#value.

因此,如果我的页面有一个名为“foobar”的字段,我将动态创建一个方法,如下所示:

def foobar
  fields.find_by_name("foobar").value
end

这可以实现吗?如果是这样,请帮忙?

交给红宝石学家...

4

1 回答 1

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
于 2010-08-25T21:54:03.443 回答