评估控制器中每个do块内的迭代器

时间:2012-10-12 21:39:51

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试遍历由空格分隔的数组:

diff_attr = []

%w[name hours].each do |a|
  if @old_place.a != new_place[a.to_sym]
    diff_attr << a
  end
end

我想比较两个不同对象的属性(名称和小时)。现在,我得到一个未定义的方法'a'错误。现在,a被评估为@old_place的方法,而不是作为变量。

如何评估块内的迭代器,以便我进行比较:

@old.place.name != new_place[:name]

而不是

@old.place.a != new_place[:a]

2 个答案:

答案 0 :(得分:3)

好吧,你可以像new_place那样做(假设两者都是ActiveRecord对象):

if @old_place[a] != new_place[a]

或者,使用Object#send

if @old_place.send(a) != new_place.send(a)

答案 1 :(得分:1)

另一个选择是不要害怕并在Ruby中使用eval:

diff_attr = []

%w[name hours].each do |a|
  if eval("@old_place.#{a}") != new_place[a.to_sym]
    diff_attr << a
  end
end