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

时间:2016-03-19 18:44:08

标签: ruby-on-rails activerecord nested-forms

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

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

1 个答案:

答案 0 :(得分: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))
...