1

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>

4

2 に答える 2

1

私も同様の状況にあり、現在(あなたのように)解決策を探しています。私が見つけたRails3のソースから:

activerecord / lib / active_record / nested_attributes.rb:

# === One-to-many
#
# Consider a member that has a number of posts:
#
#   class Member < ActiveRecord::Base
#     has_many :posts
#     accepts_nested_attributes_for :posts
#   end
#
# You can now set or update attributes on an associated post model through
# the attribute hash.
#
# For each hash that does _not_ have an <tt>id</tt> key a new record will
# be instantiated, unless the hash also contains a <tt>_destroy</tt> key
# that evaluates to +true+.

これがあなたにアイデアを与えることを願っています。

于 2011-01-14T04:39:28.437 に答える