RailsCasts Nested Model Form Part 2 の例からネストされたモデルを作成し、Rails 3 と JQuery で動作させました。現在、ユーザーは新しいプロジェクトを作成し、リンクをクリックして新しいタスクを追加できます。また、各新しいタスク内で、各タスクに新しい割り当てを追加できるリンクをクリックします。新しいタスクを作成するためのリンクは次のとおりです (新しい割り当てを作成するためのリンクも同様です)。
<p><%= link_to_add_fields "Add task", f, :task %></p>
それはこのヘルパーを指します:
def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s.singularize + "_fields", :f => builder)
end
link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))end
リンクをクリックすると、JQuery を介して html が追加され、タスク名のフォーム フィールドと、ユーザーがタスクに新しい割り当てを追加できるリンクが表示されます。
私がやりたいのは、割り当てフォームをタスク名フィールドの横に表示して、ユーザーが追加のリンクをクリックして各タスクに新しい割り当てを追加する必要がないようにすることです。プロジェクト コントローラーを介してページが最初に読み込まれるときに、これを実行できます。
1.times do
task = @product.tasks.build
1.times { task.assignments.build}
end
ただし、JQuery を使用して HTML を追加および削除しているため、新しいタスクを「追加」するときにコントローラーが呼び出されず、フォームが構築されません。
新しいタスク フィールドが作成されたときに、ネストされた割り当てフィールドを (タスク パーシャル内から) 自動的に「構築」する方法はありますか?
ユーザーがフォームの「新しいタスク」リンクをクリックしたときに作成されるタスク フォームのパーシャルは次のとおりです。
<div class = "fields">
<%= f.label :name, "Task name"%>
<%= link_to_remove_fields "remove", f %><br />
<%= f.text_field :name %>
<% f.fields_for :assignments do |builder| %>
<%= render 'assignment_fields', :f => builder %>
<% end %>
<p><%= link_to_add_fields "Add assignments", f, :assignments %></p>