6

Rails Guidesとこの Railscasts エピソードによると、2つのオブジェクト (例:と) の間に 1対多の関連付けがある場合、次のように during フォーム送信と一緒に の複数のインスタンスを送信できます。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 %>

これにより、タスクごとに 1 つずつ、次のような 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ますか? ブラウザがソースに表示されるのと同じ順序でフォーム パラメータを送信する必要があることは保証されていますか?

4

2 に答える 2

4

はい、@k-everest が元の質問へのコメントとして自己回答したため、順序はそのまま保持されます。

HTML が必要な場合は、属性の解析方法に関するガイドを参照してください。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

于 2016-03-31T12:52:55.133 に答える
2

ストレート データで作業していて、これらの @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 %>

params データは次のように返されるはずです

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}
于 2015-02-19T00:36:36.377 に答える