【问题标题】:Rails 4.0.0 strong parameters don't seem to work as documentedRails 4.0.0 强参数似乎不像记录的那样工作
【发布时间】:2013-09-24 19:33:42
【问题描述】:

文档 (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)

这似乎不是很干 - 如果需要一个参数,那么根据定义,它当然是允许的。

我错过了什么吗?

【问题讨论】:

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


    【解决方案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 只接受一个参数是有道理的,因为您希望为每个对象类型设置一个唯一的 &lt;attribute&gt;_params 方法,因为这些又是针对特定对象的包装器。但是,通常您只会将 1 个根对象发送到表单提交中,并在其中发送子对象。

    【讨论】:

    • 谢谢。这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2016-02-27
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多