0

的文档(http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters)在强大的参数使用的例子是:的Rails 4.0.0强大的参数似乎没有工作,因为记录

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

但是,这并不工作,因为需要()返回可以调用参数的值,而不是另一个可以调用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>' 

此外,要求只能取1个参数似乎很奇怪。看来你应该能够做到:

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

然而,你必须做的是:

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

这似乎不是很干 - 如果需要的参数,然后它是由定义允许,当然。

我错过了什么吗?

回答

1

require的意图是与Rails form_for对象一起使用,其中params散列将包含要包装表单的对象的名称。所以像这样:

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

在这种情况下,form_for会一直缠着Person对象。因此,.require(:person)将随后将生成的散列({ name: 'Francesco' })包装到可响应.permitActionController::Parameters对象中。所以你的测试并不是模仿预期的params用例。

此外,有意义的是require只接受一个参数,因为您希望为每个对象类型设置一个唯一的<attribute>_params方法,因为这些方法同样也是针对特定对象的包装。但是,通常只有1个根对象被发送到表单提交中,并且其中的子对象。

+0

谢谢。这是有道理的。 –