Rails 4.0.0强大的参数似乎没有记录的工作

时间:2013-09-24 19:33:43

标签: ruby-on-rails ruby-on-rails-4 actioncontroller strong-parameters

强参数文档(http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters)中使用的示例是:

params.require(:person).permit(:name, :age)

但是,这不起作用,因为require()返回参数的值,而不是另一个可以调用permit()的参数对象。

$ rails console
1.9.3p286 :005 > params = ActionController::Parameters.new(person: 1, name: "Joe", age: 30)
 => {"person"=>1, "name"=>"Joe", "age"=>30} 
1.9.3p286 :006 > params.require(:person).permit(:name, :age)
NoMethodError: undefined method `permit' for 1:Fixnum
    from (irb):6
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

此外,似乎奇怪的是,require只能使用1个参数。看来你应该可以做到:

params.require(:a, :b).permit(:c, :d)

然而,你要做的是:

params.require(:a)
params.require(:b)
params.permit(:a, :b, :c, :d)

看起来不是很干 - 如果需要参数,那么肯定是允许的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

require的意图是使用Rails form_for对象,其中params散列将包含您正在包裹表单的对象的名称。像这样:

ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person)

在这种情况下,form_for将被包裹在Person对象周围。因此,.require(:person)会将生成的哈希({ name: 'Francesco' })包装到ActionController::Parameters对象中,该对象可以响应.permit。所以你的测试并不是模仿预期的params用例。

另外,require只接受一个参数是有道理的,因为你想为每个对象类型设置一个唯一的<attribute>_params方法,因为这些方法同样是围绕一个特定的包装器宾语。但是,通常你只有一个根对象被发送到表单提交,以及其中的子对象。