この 2 つを完全に混同している可能性がありますが、ネストされたルートに基づく配列引数を使用して、フォームが関連付けを容易にできることがわかりました。例:
<%= form_for [@project, @task]...
または、親クラスが子のfields_for
場合はヘルパーを使用します。accepts_nested_nested_attributes_for
これらのアプローチの違い/トレードオフは何ですか?
この 2 つを完全に混同している可能性がありますが、ネストされたルートに基づく配列引数を使用して、フォームが関連付けを容易にできることがわかりました。例:
<%= form_for [@project, @task]...
または、親クラスが子のfields_for
場合はヘルパーを使用します。accepts_nested_nested_attributes_for
これらのアプローチの違い/トレードオフは何ですか?
与えられた答えが思ったほど明確ではなかったので、もう少し調査を行った後、満足のいく答えを見つけたので、他の人と共有することにしました.
ネストされたルート アプローチ
基本的に、ネストされたルートのアプローチは、子モデルのフォームをそれ自体が単一のフォームとして提示する場合に役立ちます。つまり、子として Comment モデルを持つ Post モデルを持つブログがある場合、ネストされたルートを使用して子のフォームを表示し、そのフォームを送信すると Rails が子を関連付けるという点で魔法を実行できるようにすることができます。親と。
ネストされた属性アプローチ
一方、accepts_nested_attributes_for メソッドは、単一のフォームの外観を呈しながら、実際には複数のフォームが 1 つの送信ボタンにマージされたフォームを表示するために、より適切に使用されます。
要約すると、ネストされたルート アプローチは単一の形式で 1 つのモデルを扱いますが (親モデルに関連付けられています)、ネストされた属性のアプローチは単一の形式で複数のモデルを扱います。
違いは初心者には微妙かもしれませんが、理解するのに十分意味があります。
これについて質問がある他の人に役立つことを願っています。乾杯。
これは子モデルのフォームです:
<%= form_for [@project, @task] ... %>
Task
既存のものを提出する場所Project
。
ここ@project = Project.find(params[:project_id])
とドキュメント@task = Task.new
によると、または既存のタスクを更新している場合。@task = Task.find(params[:id])
これは、親モデル フォームで使用されます。
<%= form_for @project do |f| %>
<%= f.fields_for :task do |builder| %>
<% # ... %>
<% end %>
<% end %>
両方のオブジェクトを一度に作成または更新できます。オブジェクトを更新する場合、属性はwith タスクTask
に渡されます。params[:project][:task_attributes]
id