如何设置alias_attribute的值?

时间:2017-03-09 11:10:05

标签: ruby-on-rails

我正在通过循环设置一些模型属性:

USER_ATTRIBUTES = [:name, :foo]
USER_ATTRIBUTES.each do |field|
  write_attribute(field, new_data[field])
end

:name会在此处更新,但:foo不会,因为它是:bar的别名,这是我们存储在数据库中的内容。在模型中:

alias_attribute :foo, :bar

因此,当循环到达write_attribute(:foo, new_data[:foo])时,它会失败并显示ActiveModel::MissingAttributeError: can't write unknown attribute 'foo'

1 个答案:

答案 0 :(得分:2)

alias_attribute做了什么,好吧,别名setter和几个属性的getter。新名称​​不成为真正的属性。因此,如果使用原始的,不合理的名称是不可取的,那么您唯一的选择是调用setter,而不是write_attribute

USER_ATTRIBUTES = [:name, :foo]
USER_ATTRIBUTES.each do |field|
  send("#{field}=", new_data[field])
  # equivalent to 
  # self.foo = new_data(:foo)
end

作为奖励,这也适用于所有其他非属性设置器,例如attr_accessors。