将Rails 3.2应用程序升级到Rails 4,Strong Params表现得很奇怪

时间:2015-10-16 14:21:44

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2 strong-parameters mass-assignment

我正在将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

你知道问题可能是什么吗?

2 个答案:

答案 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

删除它让我能够只允许我想要的参数。