使用'link_to_add_fields helper'自动构建嵌套模型表单

时间:2010-07-19 14:47:48

标签: jquery ruby-on-rails nested-forms

我已经在RailsCasts嵌套模型表单第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>

2 个答案:

答案 0 :(得分:1)

我有类似的情况,我现在(像你一样)寻找解决方案。 从Rails 3来源我发现:

的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+.

我希望这会给你一些想法。

答案 1 :(得分:0)

创建任务表单后,您可以使用jQuery模拟添加分配链接的单击。这样你根本就不依赖于rails控制器。

after_create_handler = function() { $('assignment add link identifier').click() }