有Dog模型和Specie模型,属于Dog。当创建Dog时,Rails还会生成嵌套表单以添加specie,通过按钮'add specie'。麻烦的是,在添加嵌套表单之后,在父表单之前进行查看。如果我添加了很多其他嵌套表单,则父表单是最后一个表单。肯定不好。
class Dog < ActiveRecord::Base
attr_accessible :name, :species_attributes
has_many :species
accepts_nested_attributes_for :species
validates :name, :presence => true
end
class Specie < ActiveRecord::Base
attr_accessible :name, :specie_id
belongs_to :dog
validates :name, :presence => true
end
&LT;
div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<%= f.fields_for :species do |builder| %>
<%= render 'specie_fields', :f=> builder %>
<% end %>
<%= button_to_add_fields 'Add Specie', f, :species %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
_specie_fields.html.erb:
<div class="field">
<%= f.label :name, 'Specie' %> <br />
<%= f.text_field :name %>
<%= f.hidden_field :_destroy %>
<%= button_to_function 'Specie delete', 'remove_fields(this)' %>
</div>
辅助方法:
module ApplicationHelper
def button_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
button_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end
end
JS档案:
function add_fields(link, association, content) {
var new_id = new Date().getTime();
var regexp = new RegExp("new_" + association, "g")
$(link).parent().before(content.replace(regexp, new_id));
答案 0 :(得分:0)
你必须检查你的JS函数“add_fields”。
此功能将您的嵌套表单添加到错误的位置。
答案 1 :(得分:0)
在JS文件中,用parent().before
替换before
,如下所示:
$(link).before(content.replace(regexp, new_id));
这样你在帮助器中的这一行按钮($(link)
是this
)之前插入你的部分:button_to_function(name, "add_fields(this, ...
),而不是它的父亲之前(这是父母的任何东西)您的<%= button_to_add_fields 'Add Specie', f, :species %>
,可能是整个表格。