2016-03-19 27 views
0

我有一个表格,目的在关联更新对象的集合:白名单参数从嵌套形式的多个对象

<%= form_tag(url: update_parent_children_path(parent_id: @parent.id), method: :put) do %> 
    <% @children.each do |child| %> 

    <%= fields_for "children[]", child do |cf| %> 

    .... Fields for form 

在参数方面,这给人的印象是:

params[:children] --> 
    {"1" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"}, 
    "2" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"}, 
    "3" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"}} 

我知道将对象的一个​​实例列入白名单,我会使用:

params.require(:child).permit(:foo, :bar, :baz) 

是否有类似的方法允许儿童参数的完整列表?

为了参考,代码的更新块我将使用:

def update_children_on_parent 
    @children.each do |child| 
    child_params = update_params.select{|key, value| key == child.id} 
    child.update(child_params) 
    end 
end 

其中update_params是白名单孩子参数列表

+0

在父控制器'params.require(:亲本).permit(:孩子=> {:FOO,:巴} '应该允许你传递嵌套参数,并且阅读'accept_nested_attributes_for' – toddmetheny

回答

0

在更新功能,允许单独PARAMS而不是作为一个预定的白名单。

鉴于

params[:children] --> 
{ 
    "1" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"}, 
    "2" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"}, 
    "3" =>{"foo"=>"x", "bar"=>"y", "baz"=>"z"} 
}, 

更新功能的工作原理如下:

@children.each do |child| 
    child_params = params[:children].select{|key, value| key == child.id.to_s}["#{child.id}"] 
    child.update(child_params.permit(:foo, :bar, :baz)) 
...