【问题标题】:How does Rails group arrays of hashes during form submission?Rails 在表单提交期间如何对哈希数组进行分组?
【发布时间】:2012-05-09 12:30:52
【问题描述】:

根据Rails Guidesthis Railscasts 情节,当两个对象(例如ProjectTask)之间存在一对多 关联时,我们可以提交多个TaskProject 在表单提交期间的实例类似于:

<% form_for :project, :url => projects_path do |f| %>
  <p>
    Name: <%= f.text_field :name %>
  </p>
  <% for task in @project.tasks %>
    <% fields_for "project[task_attributes][]", task do |task_form| %>
      <p>
        Task Name: <%= task_form.text_field :name %>
    Task Duration: <%= task_form.text_field :duration %>
      </p>
    <% end %>
  <% end %>
  <p><%= submit_tag "Create Project" %></p>
<% end %>

这将在表单中生成多个这样的 HTML 块副本,每个任务一个:

<p>
    Task Name: <input name="project[task_attributes][name]">
    Task Duration: <input name="project[task_attributes][duration]">
</p>

我的问题是,Rails 如何理解哪个

    (project[task_attributes][name], project[task_attributes][duration])

属于一起,并将它们打包到params中的结果数组的哈希元素中?是否保证浏览器必须按照它们在源中出现的顺序发送表单参数?

【问题讨论】:

  • 呃!刚刚找到答案here。显然这是标准要求的。

标签: ruby-on-rails


【解决方案1】:

如果您正在处理直接数据并希望在不使用任何这些@objects 的情况下发回数组

<%= form_for :team do |t| %>
  <%= t.fields_for 'people[]', [] do |p| %>
    First Name: <%= p.text_field :first_name %>
    Last Name: <%= p.text_field :last_name %>
  <% end %>
<% end %>

你的参数数据应该像这样返回

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}

【讨论】:

  • 如果您想添加它,所创建的 HTML 将使这个答案也适用于许多其他搜索它的人 :)
  • 是的,HTML 会有所帮助
  • 是的,请提供 HTML。
【解决方案2】:

是的,按原样保留排序,@k-everest 自我回答作为对原始问题的评论。

那些要求 HTML 的人,请参阅 guide,了解如何解析属性的 name

典型的错误排序示例:

cart[items][][id]=5
cart[items][][id]=6
cart[items][][name]=i1
cart[items][][name]=i2

Rails 将其解析为:

{ "cart"=> {"items"=> [
                        {"id"=>"5"},
                        {"id"=>"6", "name"=>"i1"},
                        {"name"=>"i2"}
                       ]}}

示例来源:https://spin.atomicobject.com/2012/07/11/get-and-post-parameter-parsing-in-rails-2/

该功能是在 Rails 的初始提交中添加的,方法名称为 build_deep_hash。想了解更多历史,请跳过火焰/语义大战,然后从这里开始阅读最后一篇文章:https://www.ruby-forum.com/topic/215584

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多