我正在通过循环设置一些模型属性:
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'
答案 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。