将嵌套表单中多个对象的参数列入白名单



我有一个表单,旨在更新关联中的对象集合:

<%= 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是列入白名单的子参数列表

在更新函数中,允许单独使用参数,而不是作为预定义的白名单。

鉴于

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))
...

最新更新