【问题标题】:Whitelisting parameters for multiple objects from nested form嵌套表单中多个对象的白名单参数
【发布时间】:2016-03-19 18:44:08
【问题描述】:

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

<%= 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.require(:parent).permit(:child =&gt; { :foo, :bar } 应该允许你传递嵌套参数。另请阅读accepts_nested_attributes_for

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


【解决方案1】:

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

给定

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多