2017-03-09 55 views
0

我設置一些模型通過循環屬性:如何將值設置爲alias_attribute?

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

其中屬性first_name來自哪裏?用更多的細節詳細說明你的問題 – anusha

+0

這將是'foo',而不是'first_name'。不好意思,現在應該都很好 – abpetkov

回答

2

什麼alias_attribute所做的是吧,好,別名setter和一對夫婦爲干將的屬性。新名稱不是成爲真正的屬性。因此,如果使用原始名稱,則不需要使用名稱,您唯一的選擇是調用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。

+0

今天你是我的英雄!乾杯! – abpetkov