Skip to content
This repository has been archived by the owner on Dec 12, 2021. It is now read-only.

3 Level nested form bug #276

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Next Next commit
fix link_to_add bug when specify target in a 3 level nested form
Ben Zhang committed Jul 9, 2013
commit 01924f34cea4b68869a4890cb4d9c4f5e91d9d7d
17 changes: 17 additions & 0 deletions spec/dummy/app/views/projects/with_target_links.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<%= nested_form_for Project.new do |f| -%>
<%= f.text_field :name %>
<div id="task-fields">
<%= f.fields_for :tasks do |tf| -%>
<%= tf.text_field :name %>
<div id="milestone-fields">
<%= tf.fields_for :milestones do |mf| %>
<%= mf.text_field :name %>
<%= mf.link_to_remove 'Remove milestone' %>
<% end %>
</div>
<%= tf.link_to_add 'Add new milestone', :milestones, data: {target: '#milestone-fields'} %>
<%= tf.link_to_remove 'Remove' %>
<% end -%>
</div>
<%= f.link_to_add 'Add new task', :tasks, data: {target: '#task-fields'} %>
<% end -%>
10 changes: 10 additions & 0 deletions spec/form_spec.rb
Original file line number Diff line number Diff line change
@@ -40,6 +40,16 @@ def check_form
inputs.first[:name].should_not eq(inputs.last[:name])
end

it 'works when specify target', :js => true do
visit '/projects/with_target_links'
click_link 'Add new task'
click_link 'Remove'
click_link 'Add new task'
click_link 'Add new milestone'

page.should have_selector('#milestone-fields .fields', visible: true)
end

it 'generates correct name for the nested input', :js => true do
visit '/projects/new?type=jquery'
click_link 'Add new task'
8 changes: 6 additions & 2 deletions vendor/assets/javascripts/jquery_nested_form.js
Original file line number Diff line number Diff line change
@@ -60,8 +60,12 @@
},
insertFields: function(content, assoc, link) {
var target = $(link).data('target');
if (target) {
return $(content).appendTo($(target));
if (target) {
if($(link).closest('.fields').length > 0) {
return $(content).appendTo($(link).closest('.fields').find($(link).data('target')));
} else {
return $(content).appendTo($(target));
}
} else {
return $(content).insertBefore(link);
}