如何使用StrongParameters gem允许嵌套哈希参数?

时间:2014-06-30 15:04:30

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

我正在使用Ruby on Rails 4.1,我想通过使用StrongParameters gem允许以下传入参数:

# Parameters:
{
  "my_key" => {
    "one"  => {
      "0"  => { "a" => "a_value", "b" => "b_value"},
      "1"  => { "a" => "a_value", "b" => "b_value"},
      "2"  => { "a" => "a_value", "b" => "b_value"}
    },
    "two"  => {
      "0"  => { "c" => "c_value", "d" => "d_value"},
      "1"  => { "c" => "c_value", "d" => "d_value"},
      "2"  => { "c" => "c_value", "d" => "d_value"}
    }
  }
}

在控制器中我试过

params
  .require(:my_key)
  .permit(
    [
      :one  => [
        "0" => [:a, :b],
        "1" => [:a, :b],
        "2" => [:a, :b]
      ],
      :two  => [
        "0" => [:c, :d],
        "1" => [:c, :d],
        "2" => [:c, :d]
      ]
    ]
  )

params
  .require(:my_key)
  .permit(
    {
      :one  => {
        "0" => [:a, :b],
        "1" => [:a, :b],
        "2" => [:a, :b]
      },
      :two  => {
        "0" => [:c, :d],
        "1" => [:c, :d],
        "2" => [:c, :d]
      }
    }
  )

但是我收到了错误

ActionController::UnpermittedParameters (found unpermitted parameters: a, b)

应该如何允许上述参数?

1 个答案:

答案 0 :(得分:-1)

以下是您需要做的事情:

  1. Gemfile
  2. 中移除强参数gem
  3. 在控制器中使用它。
  4. params.require(:my_key).permit({:one=>[:a, :b],:two=>[:c, :d]})

    我认为这与嵌套属性的工作方式有关。 ids "0", "1", "2"等是隐含的。

    您可以在控制台中进行如下测试:

    $ bin/rails c
    Loading development environment (Rails 4.1.2)
    2.1.0 :001 > params = ActionController::Parameters.new "my_key"=>{"one"=>{"0"=>{"a"=>"a_value","b"=>"b_value"},"1"=>{"a"=>"a_value","b"=>"b_value"},"2"=>{"a"=>"a_value","b"=>"b_value"}},"two"=>{"0"=>{"c"=>"c_value","d"=>"d_value"},"1"=>{"c"=>"c_value","d"=>"d_value"},"2"=>{"c"=>"c_value","d"=>"d_value"}}}
     => {"my_key"=>{"one"=>{"0"=>{"a"=>"a_value", "b"=>"b_value"}, "1"=>{"a"=>"a_value", "b"=>"b_value"}, "2"=>{"a"=>"a_value", "b"=>"b_value"}}, "two"=>{"0"=>{"c"=>"c_value", "d"=>"d_value"}, "1"=>{"c"=>"c_value", "d"=>"d_value"}, "2"=>{"c"=>"c_value", "d"=>"d_value"}}}} 
    2.1.0 :002 > p = params.require(:my_key).permit({:one=>[:a, :b],:two=>[:c, :d]})
     => {"one"=>{"0"=>{"a"=>"a_value", "b"=>"b_value"}, "1"=>{"a"=>"a_value", "b"=>"b_value"}, "2"=>{"a"=>"a_value", "b"=>"b_value"}}, "two"=>{"0"=>{"c"=>"c_value", "d"=>"d_value"}, "1"=>{"c"=>"c_value", "d"=>"d_value"}, "2"=>{"c"=>"c_value", "d"=>"d_value"}}} 
    2.1.0 :003 >