我正在将Rails 3.2应用程序升级到Rails 4的过程中。
我正在努力用控制器中的Strong Params替换模型中的attr_accessible
。
我注意到#permit
方法在3.2升级时的行为与在Rails 4应用程序中的行为有所不同。为了验证我的怀疑,我从头开始创建了一个新的Rails 4应用程序并测试了相同的代码,同时得到了不同的结果:
目前正在升级的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
Rails 4 app
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
gem,我也将此代码放在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 :(得分:0)
您需要允许所有嵌套参数,请参阅此处:http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit。
所以在你的情况下,你应该做的第一个属性
params.permit(attr1: [:attr2, :attr2])
同样适用于哈希的其他部分。
答案 1 :(得分:0)
显然我收到此错误的原因是因为我在config/application.rb
config.action_controller.action_on_unpermitted_parameters = :raise
删除它让我能够只允许我想要的参数。