1

我使用的Rails 4.1 Ruby和我想通过StrongParameters宝石,可以进行如下传入的参数:如何使用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

顺便说一句,这种宝石你提到不使用Rails 4.0+兼容。它只适用于之前的版本。 – San

回答

0

以下是你需要做的:

  1. Gemfile删除强参数宝石。
  2. 在控制器中使用。

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

我觉得这是与嵌套的属性是如何工作的。暗号"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 >