2012-12-13 43 views
14

This video指出可以保護通過控制器進入的輸入,但仍然可以通過型號和規格進行質量分配。但是,在3.2.8中使用strong_parameters時,我沒有看到這被記錄爲一項功能。導軌中的強參數3.2.8

據我所知,我需要在ActiveModel::ForbiddenAttributesProtection中混入我的車型,並在config/application.rb中設置config.active_record.whitelist_attributes = false。我也從模型中調用了所有的attr_accessible調用。

有或沒​​有mixin我得到質量分配錯誤。

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: home_phone, cell_phone

我這麼想嗎?

+2

如果你使用'attr_protected:home_phone,:cell_phone',他們將無法進行批量分配。 – VenkatK

+1

不幸的是,我的模型中沒有'attr_protected'。但是我得到了同樣的錯誤。 –

+0

@ brandon-hansen - 你有沒有看過Ryan Bates在這個主題上的railscast? http://railscasts.com/episodes/371-strong-parameters?view=asciicast – simonmorley

回答

19

建議的RailsCast可能是一個良好的開端,但這裏是你必須在Rails3.x做才能工作,而不是attr_accessible強大的參數內容摘要:

  1. 添加gem 'strong_parameters'到您的Gemfile和運行包。

  2. 註釋掉(或設置爲false)config.active_record.whitelist_attributes = true中的config/application.rb中

  3. 在混合模型中的ActiveModel::ForbiddenAttributesProtection(該railscast建議這樣做在一個新的初始化,配置/初始化/ strong_parameters。 RB ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)

  4. 從現在起,你將不得不使用的語法像這樣:

    model_params = params[:model].permit(:attribute, :another_attribute) 
    @model.update_attributes(model_params) 
    

    當你更新你的模型。在這種情況下,params[:model]中除:attribute:another_attribute之外的任何屬性都將導致ActiveModel :: ForbiddenAttributes錯誤。

您還可以使用的新的魔法其餘則來自ActionController::Parameters,如.require(:attribute)強制屬性的存在。

+0

仍然有效,應該接受 –

2

它與您的問題不一樣,但它可能會出現給其他人獲取MassAssignmentSecurity :: Error。即使我已經採取了規定的步驟切換到使用強參數而不是質量分配保護,我也遇到了一個問題,即'id'和'type'屬性似乎被默認保護。我有一個名爲'type'的關聯,我將其重命名爲'project_type'來解決問題(該屬性已經是project_type_id)。

+0

對於屬性或關係使用'type'是一個壞主意,因爲Rails使用它來跟蹤STI關係。所以它或多或少是一個保留的屬性:)另外'id'是默認的參數,在很多情況下由路由器設置,這樣可能會使用起來不穩定。 –

+0

@ d-Pixie足夠公平,但我得到的錯誤真的沒有幫助,也很混亂。一個錯誤說不使用這些會很好,當整個系統被禁用時,MassAssignmentSecurity :: Error會非常混亂。類型是我打的那個,當我挖掘到源代碼時,我發現id也受到了影響。 –

+0

出現同樣的問題,錯誤不是描述性的。如果您不使用STI,請使用'self.inheritance_column = nil'來修復。 – toxaq