2013-01-07 76 views
4

試圖找到活動記錄協會是否應該在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)

回答

4

由於經常確切的答案是:「這取決於™」要質量,分配應作出訪問

只是屬性。

所以,如果你想要或需要做的......

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中使用)

+0

有一個警告,你沒有提到可以通過':bar_id'訪問':bar'。如果您使用STI,則必須執行'attr_accessible:bar_id',否則您將無法設置關聯。 – Max

1

你能避免需要作出bar_id訪問通過關聯生成器:

# singular (has_one) 
foo = bar.build_foo(name: 'name') 

# plural (has_many) 
foo = bar.foos.build(name: 'name') 

如果您使用的是accepted_nested_attributes,則只需要使關聯可訪問即可。

+0

如果您想要執行'Bar.new(name:'blah',foo:Foo.first)'或者Foo.active在我的情況下,那麼I如果我想單線排列酒吧,我不得不接受它。新的不? – dstarh

0

雖然您可以避免在您的示例中訪問bars_id(不應該是bar_id?),但問題在於您的應用程序的某些部分是否仍然需要訪問它。使用active_admin,我必須使whatever_id易於使事情與關係一起工作。