1

我正在將Rails 3.2應用程序升級到Rails 4的過程中。 我正在從具有Strong Params的模型中替換attr_accessible控制器。 我注意到#permit方法在我升級的3.2版本上的表現與在Rails 4應用中表現得有點不同。爲了驗證我的懷疑,我創建一個新的Rails 4應用從無到有,測試相同的代碼,同時得到一個不同的結果:將Rails 3.2應用程序升級到Rails 4,強烈的Params表現出奇怪

的Rails 3.2的應用程序,目前正在升級

[9] pry(main)> x = { attr1: { attr2: "val1", attr3: "val2"}, attr4: "val3", attr5: "val4", attr6: { attr7: "val5"}} 
=> {:attr1=>{:attr2=>"val1", :attr3=>"val2"}, :attr4=>"val3", :attr5=>"val4", :attr6=>{:attr7=>"val5"}} 
[10] pry(main)> params = ActionController::Parameters.new x 
=> {"attr1"=>{"attr2"=>"val1", "attr3"=>"val2"}, "attr4"=>"val3", "attr5"=>"val4", "attr6"=>{"attr7"=>"val5"}} 
[11] pry(main)> params.require(:attr1) 
=> {"attr2"=>"val1", "attr3"=>"val2"} 
[12] pry(main)> params.permit(:attr1) 
    ActionController::UnpermittedParameters: found unpermitted parameters: attr1, attr4, attr5, attr6 
[19] pry(main)> params.permit(:attr4) 
ActionController::UnpermittedParameters: found unpermitted parameters: attr1, attr5, attr6 

軌道4,5應用

2.2.3 :009 > x = { attr1: { attr2: "val1", attr3: "val2"}, attr4: "val3", attr5: "val4", attr6: { attr7: "val5"}} 
=> {:attr1=>{:attr2=>"val1", :attr3=>"val2"}, :attr4=>"val3", :attr5=>"val4", :attr6=>{:attr7=>"val5"}} 
2.2.3 :012 > params = ActionController::Parameters.new x 
=> {"attr1"=>{"attr2"=>"val1", "attr3"=>"val2"}, "attr4"=>"val3", "attr5"=>"val4", "attr6"=>{"attr7"=>"val5"}} 
2.2.3 :013 > params.require(:attr1) 
=> {"attr2"=>"val1", "attr3"=>"val2"} 
2.2.3 :014 > params.permit(:attr1) 
=> {} 
2.2.3 :032 > params.permit(:attr4) 
=> {"attr4"=>"val3"} 

我在升級過程中使用protected_attributes寶石,我也放在這個代碼config/initializers/strong_parameters.rb

ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection) 
# config.action_controller.always_permitted_parameters = %w(controller action format) 

module ActionController 
    class Parameters 
    remove_const(:NEVER_UNPERMITTED_PARAMS) if (defined?(NEVER_UNPERMITTED_PARAMS)) 

    NEVER_UNPERMITTED_PARAMS = %w(controller action format) 
    end 
end 

你知道這個問題可能是什麼嗎?

回答

0

您需要允許所有嵌套參數,請參閱:http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

所以你的情況,對第一屬性,你應該做

params.permit(attr1: [:attr2, :attr2]) 

,同樣爲您的哈希的其他部分。

+0

對不起,但這與我所問的問題無關。我知道你也應該允許嵌套參數。我的問題是關於事實,無論我嘗試允許我會得到'ActionController :: UnpermittedParameters:'。 – Dmitri

+0

此外,如果您閱讀我的問題,你應該注意到,我還提供了一個例子,其中我沒有任何嵌套參數的白名單'attr4',但我得到相同的錯誤。 – Dmitri

0

顯然,我得到這個錯誤的原因是因爲我在config/application.rb

config.action_controller.action_on_unpermitted_parameters = :raise 

刪除了此設置,它給了我,只允許我想要的PARAMS的能力。

相關問題