試圖找到活動記錄協會是否應該在attr_accessible屬性列表中明確的答案。Rails的3.2.x中協會和attr_accessible
我見過
class Foo
attr_accessible :name
attr_accessible :bars
belongs_to :bar
end
也看到
attr_accessible :bars_id
想知道正確的方法是能夠做到Foo.new(名稱: '名稱' 欄:barvar)
試圖找到活動記錄協會是否應該在attr_accessible屬性列表中明確的答案。Rails的3.2.x中協會和attr_accessible
我見過
class Foo
attr_accessible :name
attr_accessible :bars
belongs_to :bar
end
也看到
attr_accessible :bars_id
想知道正確的方法是能夠做到Foo.new(名稱: '名稱' 欄:barvar)
由於經常確切的答案是:「這取決於™」要質量,分配應作出訪問
只是屬性。
所以,如果你想要或需要做的......
Foo.new(name: 'name', bar: barvar)
...那麼你只需必須使bar
訪問。
最後assign_attributes
被調用,它在檢查屬性的可訪問性後執行簡單的send("#{attribute_name}=", attribute_value)
。
一些編碼風格方面:處理param
哈希時
通常質量分配情況。至少這就是潛伏着安全問題的地方。在那裏你很少有一個Bar
對象,但更多的是bar_id
。
不過,如果你用的模型實例工作,大多數人更願意使用關聯方法(如@Andrew奈斯比特寫的),因爲經常有一些優勢(自動保存,關聯對應的自動更新,更乾淨的代碼,...)
所以有理由有一個或另一個或兩個。
我的個人意見:不應該浪費很多時間在這個話題上,因爲Rails 4.0將有a better solution參數消毒。 (請參閱strong_parameters,如果您也想在Rails 3中使用)
你能避免需要作出bar_id訪問通過關聯生成器:
# singular (has_one)
foo = bar.build_foo(name: 'name')
# plural (has_many)
foo = bar.foos.build(name: 'name')
如果您使用的是accepted_nested_attributes,則只需要使關聯可訪問即可。
如果您想要執行'Bar.new(name:'blah',foo:Foo.first)'或者Foo.active在我的情況下,那麼I如果我想單線排列酒吧,我不得不接受它。新的不? – dstarh
雖然您可以避免在您的示例中訪問bars_id
(不應該是bar_id
?),但問題在於您的應用程序的某些部分是否仍然需要訪問它。使用active_admin,我必須使whatever_id
易於使事情與關係一起工作。
有一個警告,你沒有提到可以通過':bar_id'訪問':bar'。如果您使用STI,則必須執行'attr_accessible:bar_id',否則您將無法設置關聯。 – Max