Ruby:动态调用可用方法引发未定义的方法(元编程)

时间:2010-04-21 23:29:49

标签: ruby-on-rails ruby activerecord metaprogramming

我有一个名为Foo的Activerecord对象:

Foo.attribute_names.each do |attribute|
  puts Foo.find(:all)[0].method(attribute.to_sym).call
end

这里我调用此模型的所有属性(即查询每个列值)。 但是,有时候,我会得到一个未定义的方法错误。

ActiveRecord :: Base#attribute_names如何返回一个属性名称,当转换为自己的方法调用时会引发未定义的方法错误?

请记住,这仅适用于某些特定方法的某些对象。我无法识别模式。

谢谢。

2 个答案:

答案 0 :(得分:2)

NoMethodError应该告诉你哪个对象不存在哪个方法。您的find可能没有返回记录吗?在这种情况下,[][0]nil,您肯定会获得NoMethodError

我会使用.fetch(0)代替[0],如果没有索引为0的元素,您将获得KeyError

注意:不需要to_sym;所有内置方法都接受名称方法作为字符串或符号(均在1.8和1.9中)

答案 1 :(得分:0)

也许与访问有关?就像一个类有一个attr_protected属性,或类似的东西。或者对于不是数据库列的属性,没有定义访问器?