Rails如何在表单提交期间对哈希数组进行分组?

K E*_*est 6 ruby-on-rails

根据Rails指南这个 Railscasts插曲,当两个对象(例如和)之间存在一对多关联时,我们可以提交多个实例以及表单提交过程,类似于:ProjectTaskTaskProject

<% 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 %>
Run Code Online (Sandbox Code Playgroud)

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

<p>
    Task Name: <input name="project[task_attributes][name]">
    Task Duration: <input name="project[task_attributes][duration]">
</p>
Run Code Online (Sandbox Code Playgroud)

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

    (project[task_attributes][name], project[task_attributes][duration])
Run Code Online (Sandbox Code Playgroud)

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

小智 3

如果您正在处理直接数据并希望在不使用任何这些@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 %>
Run Code Online (Sandbox Code Playgroud)

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

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}
Run Code Online (Sandbox Code Playgroud)