nested_form 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/CHANGELOG.rdoc +18 -0
  2. data/CONTRIBUTING.md +11 -0
  3. data/Gemfile +1 -0
  4. data/README.md +3 -4
  5. data/lib/nested_form/builder_mixin.rb +38 -8
  6. data/lib/nested_form/builders.rb +8 -0
  7. data/lib/nested_form/view_helper.rb +7 -0
  8. data/spec/dummy/app/assets/javascripts/jquery_nested_form.js +13 -10
  9. data/spec/dummy/app/assets/javascripts/prototype_nested_form.js +8 -7
  10. data/spec/dummy/db/development.sqlite3 +0 -0
  11. data/spec/dummy/db/test.sqlite3 +0 -0
  12. data/spec/dummy/log/development.log +2322 -50
  13. data/spec/dummy/log/test.log +878 -422
  14. data/spec/dummy/tmp/cache/assets/C99/4D0/sprockets%2F5e30a6b911437f1428dc32c3ae182123 +0 -0
  15. data/spec/dummy/tmp/cache/assets/C99/7D0/sprockets%2F79513e6956e0ee8624976e041fd5636d +0 -0
  16. data/spec/dummy/tmp/cache/assets/CAA/C90/sprockets%2F1e6c8ee1258009385ccf5b84015424b3 +0 -0
  17. data/spec/dummy/tmp/cache/assets/CB2/CB0/sprockets%2F11cc8d161d71a716dd36f16849d90870 +0 -0
  18. data/spec/dummy/tmp/cache/assets/CB7/7F0/sprockets%2Fac97b043470f6fcc925c352f16956643 +0 -0
  19. data/spec/dummy/tmp/cache/assets/CDB/8A0/sprockets%2Faed2a2575c376263c26e93b56b57051d +0 -0
  20. data/spec/dummy/tmp/cache/assets/D1F/A10/sprockets%2F60317e62cb324bfd9987e8da9636fd06 +0 -0
  21. data/spec/dummy/tmp/cache/assets/D49/870/sprockets%2F90896142645585acc8baf56ad57e3afb +0 -0
  22. data/spec/dummy/tmp/cache/assets/D62/F00/sprockets%2F6ac03a007f26b1c18ed3d53498ad3eb8 +0 -0
  23. data/spec/dummy/tmp/cache/assets/D79/BC0/sprockets%2F85a1db977361cc5130fcefb4637ff67e +0 -0
  24. data/spec/dummy/tmp/cache/assets/D87/1F0/sprockets%2F61c9ceafb877fb740c67416ff6f782a9 +0 -0
  25. data/spec/dummy/tmp/cache/assets/DAD/4F0/sprockets%2F765acd1bf68dc90f7d3e61da78b1e659 +0 -0
  26. data/spec/dummy/tmp/cache/assets/E03/3F0/sprockets%2F82b37ae9eccec44c1ef44cfdd07d8534 +0 -0
  27. data/spec/dummy/tmp/cache/assets/E0A/CA0/sprockets%2F7fe72ac1c0db1a7e8e7f59cf25e8a39e +0 -0
  28. data/spec/dummy/tmp/cache/assets/E3A/A60/sprockets%2F7c72c96cfc66454caf5fc8ca0fedd4f3 +0 -0
  29. data/spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81 +0 -0
  30. data/spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb +0 -0
  31. data/spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc +0 -0
  32. data/spec/form_spec.rb +1 -1
  33. data/spec/nested_form/builder_spec.rb +55 -10
  34. data/spec/nested_form/view_helper_spec.rb +8 -0
  35. data/vendor/assets/javascripts/jquery_nested_form.js +13 -10
  36. data/vendor/assets/javascripts/prototype_nested_form.js +8 -7
  37. metadata +72 -87
  38. data/spec/dummy/tmp/capybara/capybara-201208212241496415482929.html +0 -31
@@ -45,6 +45,6 @@ describe 'NestedForm' do
45
45
  click_link 'Add new task'
46
46
  click_link 'Add new milestone'
47
47
  name = find('.fields .fields input[id$=name]')[:name]
48
- name.should match(/\Aproject\[tasks_attributes\]\[new_\d+\]\[milestones_attributes\]\[new_\d+\]\[name\]\z/)
48
+ name.should match(/\Aproject\[tasks_attributes\]\[\d+\]\[milestones_attributes\]\[\d+\]\[name\]\z/)
49
49
  end
50
50
  end
@@ -19,9 +19,9 @@ require "spec_helper"
19
19
 
20
20
  describe '#link_to_add' do
21
21
  it "behaves similar to a Rails link_to" do
22
- subject.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
23
- subject.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks">Add</a>'
24
- subject.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks">Add</a>'
22
+ subject.link_to_add("Add", :tasks).should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
23
+ subject.link_to_add("Add", :tasks, :class => "foo", :href => "url").should == '<a href="url" class="foo add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
24
+ subject.link_to_add(:tasks) { "Add" }.should == '<a href="javascript:void(0)" class="add_nested_fields" data-association="tasks" data-blueprint-id="tasks_fields_blueprint">Add</a>'
25
25
  end
26
26
 
27
27
  context 'when missing association is provided' do
@@ -77,13 +77,58 @@ require "spec_helper"
77
77
  end
78
78
  end
79
79
 
80
- it "should add task fields to hidden div after form" do
81
- pending
82
- output = ""
83
- mock(@template).after_nested_form(:tasks) { |arg, block| output << block.call }
84
- @builder.fields_for(:tasks) { "Task" }
85
- @builder.link_to_add("Add", :tasks)
86
- output.should == '<div id="tasks_fields_blueprint" style="display: none"><div class="fields">Task</div></div>'
80
+ it "wraps nested fields marked for destruction with an additional class" do
81
+ task = project.tasks.build
82
+ task.mark_for_destruction
83
+ fields = subject.fields_for(:tasks) { 'Task' }
84
+ fields.should eq('<div class="fields marked_for_destruction">Task</div>')
85
+ end
86
+
87
+ it "puts blueprint into data-blueprint attribute" do
88
+ task = project.tasks.build
89
+ task.mark_for_destruction
90
+ subject.fields_for(:tasks) { 'Task' }
91
+ subject.link_to_add('Add', :tasks)
92
+ output = template.send(:after_nested_form_callbacks)
93
+ expected = ERB::Util.html_escape '<div class="fields">Task</div>'
94
+ output.should match(/div.+data-blueprint="#{expected}"/)
95
+ end
96
+
97
+ it "adds parent association name to the blueprint div id" do
98
+ task = project.tasks.build
99
+ task.milestones.build
100
+ subject.fields_for(:tasks, :builder => builder) do |tf|
101
+ tf.fields_for(:milestones, :builder => builder) { 'Milestone' }
102
+ tf.link_to_add('Add', :milestones)
103
+ end
104
+ output = template.send(:after_nested_form_callbacks)
105
+ output.should match(/div.+id="tasks_milestones_fields_blueprint"/)
106
+ end
107
+
108
+ it "doesn't render wrapper div" do
109
+ task = project.tasks.build
110
+ fields = subject.fields_for(:tasks, :wrapper => false) { 'Task' }
111
+
112
+ fields.should eq('Task')
113
+
114
+ subject.link_to_add 'Add', :tasks
115
+ output = template.send(:after_nested_form_callbacks)
116
+
117
+ output.should match(/div.+data-blueprint="Task"/)
118
+ end
119
+ end
120
+
121
+ context "with options" do
122
+ subject { builder.new(:item, project, template, {}, proc {}) }
123
+
124
+ context "when model_object given" do
125
+ it "should use it instead of new generated" do
126
+ subject.fields_for(:tasks) {|f| f.object.name }
127
+ subject.link_to_add("Add", :tasks, :model_object => Task.new(:name => 'for check'))
128
+ output = template.send(:after_nested_form_callbacks)
129
+ expected = ERB::Util.html_escape '<div class="fields">for check</div>'
130
+ output.should match(/div.+data-blueprint="#{expected}"/)
131
+ end
87
132
  end
88
133
  end
89
134
  end
@@ -37,6 +37,14 @@ describe NestedForm::ViewHelper do
37
37
  end
38
38
  end
39
39
 
40
+ if defined?(NestedForm::FormtasticBootstrapBuilder)
41
+ it "should pass instance of NestedForm::FormtasticBootstrapBuilder to semantic_bootstrap_nested_form_for block" do
42
+ _view.semantic_bootstrap_nested_form_for(Project.new) do |f|
43
+ f.should be_instance_of(NestedForm::FormtasticBootstrapBuilder)
44
+ end
45
+ end
46
+ end
47
+
40
48
  it "should append content to end of nested form" do
41
49
  _view.after_nested_form(:tasks) { _view.concat("123") }
42
50
  _view.after_nested_form(:milestones) { _view.concat("456") }
@@ -7,21 +7,22 @@ jQuery(function($) {
7
7
  NestedFormEvents.prototype = {
8
8
  addFields: function(e) {
9
9
  // Setup
10
- var link = e.currentTarget;
11
- var assoc = $(link).attr('data-association'); // Name of child
12
- var content = $('#' + assoc + '_fields_blueprint').html(); // Fields template
10
+ var link = e.currentTarget;
11
+ var assoc = $(link).data('association'); // Name of child
12
+ var blueprint = $('#' + $(link).data('blueprint-id'));
13
+ var content = blueprint.data('blueprint'); // Fields template
13
14
 
14
- // Make the context correct by replacing new_<parents> with the generated ID
15
+ // Make the context correct by replacing <parents> with the generated ID
15
16
  // of each of the parent objects
16
- var context = ($(link).closest('.fields').closestChild('input, textarea').eq(0).attr('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
17
+ var context = ($(link).closest('.fields').closestChild('input, textarea, select').eq(0).attr('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '');
17
18
 
18
19
  // context will be something like this for a brand new form:
19
- // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
20
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
20
21
  // or for an edit form:
21
22
  // project[tasks_attributes][0][assignments_attributes][1]
22
23
  if (context) {
23
24
  var parentNames = context.match(/[a-z_]+_attributes/g) || [];
24
- var parentIds = context.match(/(new_)?[0-9]+/g) || [];
25
+ var parentIds = context.match(/[0-9]+/g) || [];
25
26
 
26
27
  for(var i = 0; i < parentNames.length; i++) {
27
28
  if(parentIds[i]) {
@@ -39,7 +40,7 @@ jQuery(function($) {
39
40
  // Make a unique ID for the new child
40
41
  var regexp = new RegExp('new_' + assoc, 'g');
41
42
  var new_id = new Date().getTime();
42
- content = content.replace(regexp, "new_" + new_id);
43
+ content = content.replace(regexp, new_id);
43
44
 
44
45
  var field = this.insertFields(content, assoc, link);
45
46
  // bubble up event upto document (through form)
@@ -69,9 +70,11 @@ jQuery(function($) {
69
70
  };
70
71
 
71
72
  window.nestedFormEvents = new NestedFormEvents();
72
- $('form a.add_nested_fields').live('click', nestedFormEvents.addFields);
73
- $('form a.remove_nested_fields').live('click', nestedFormEvents.removeFields);
73
+ $(document)
74
+ .delegate('form a.add_nested_fields', 'click', nestedFormEvents.addFields)
75
+ .delegate('form a.remove_nested_fields', 'click', nestedFormEvents.removeFields);
74
76
  });
77
+
75
78
  // http://plugins.jquery.com/project/closestChild
76
79
  /*
77
80
  * Copyright 2011, Tobias Lindig
@@ -1,20 +1,21 @@
1
1
  document.observe('click', function(e, el) {
2
2
  if (el = e.findElement('form a.add_nested_fields')) {
3
3
  // Setup
4
- var assoc = el.readAttribute('data-association'); // Name of child
5
- var content = $(assoc + '_fields_blueprint').innerHTML; // Fields template
4
+ var assoc = el.readAttribute('data-association'); // Name of child
5
+ var blueprint = $(el.readAttribute('data-blueprint-id'));
6
+ var content = blueprint.readAttribute('data-blueprint'); // Fields template
6
7
 
7
- // Make the context correct by replacing new_<parents> with the generated ID
8
+ // Make the context correct by replacing <parents> with the generated ID
8
9
  // of each of the parent objects
9
- var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z]+\]$'), '');
10
+ var context = (el.getOffsetParent('.fields').firstDescendant().readAttribute('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '');
10
11
 
11
12
  // context will be something like this for a brand new form:
12
- // project[tasks_attributes][new_1255929127459][assignments_attributes][new_1255929128105]
13
+ // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105]
13
14
  // or for an edit form:
14
15
  // project[tasks_attributes][0][assignments_attributes][1]
15
16
  if(context) {
16
17
  var parent_names = context.match(/[a-z_]+_attributes/g) || [];
17
- var parent_ids = context.match(/(new_)?[0-9]+/g) || [];
18
+ var parent_ids = context.match(/[0-9]+/g) || [];
18
19
 
19
20
  for(i = 0; i < parent_names.length; i++) {
20
21
  if(parent_ids[i]) {
@@ -32,7 +33,7 @@ document.observe('click', function(e, el) {
32
33
  // Make a unique ID for the new child
33
34
  var regexp = new RegExp('new_' + assoc, 'g');
34
35
  var new_id = new Date().getTime();
35
- content = content.replace(regexp, "new_" + new_id);
36
+ content = content.replace(regexp, new_id);
36
37
 
37
38
  var field = el.insert({ before: content });
38
39
  field.fire('nested:fieldAdded', {field: field});
metadata CHANGED
@@ -1,90 +1,88 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: nested_form
3
- version: !ruby/object:Gem::Version
4
- hash: 17
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 3
10
- version: 0.2.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Ryan Bates
14
9
  - Andrea Singh
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2012-08-23 00:00:00 +03:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2012-10-23 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: rake
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
26
18
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 3
31
- segments:
32
- - 0
33
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
34
23
  type: :development
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: bundler
38
24
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: bundler
33
+ requirement: !ruby/object:Gem::Requirement
40
34
  none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 3
45
- segments:
46
- - 0
47
- version: "0"
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
48
39
  type: :development
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: rspec-rails
52
40
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-rails
49
+ requirement: !ruby/object:Gem::Requirement
54
50
  none: false
55
- requirements:
51
+ requirements:
56
52
  - - ~>
57
- - !ruby/object:Gem::Version
58
- hash: 15
59
- segments:
60
- - 2
61
- - 6
62
- version: "2.6"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.6'
63
55
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: mocha
67
56
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.6'
63
+ - !ruby/object:Gem::Dependency
64
+ name: mocha
65
+ requirement: !ruby/object:Gem::Requirement
69
66
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
77
71
  type: :development
78
- version_requirements: *id004
79
- description: Gem to conveniently handle multiple models in a single form with Rails 3 and jQuery or Prototype.
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ description: Gem to conveniently handle multiple models in a single form with Rails
80
+ 3 and jQuery or Prototype.
80
81
  email: ryan@railscasts.com
81
82
  executables: []
82
-
83
83
  extensions: []
84
-
85
84
  extra_rdoc_files: []
86
-
87
- files:
85
+ files:
88
86
  - lib/generators/nested_form/install_generator.rb
89
87
  - lib/nested_form/builder_mixin.rb
90
88
  - lib/nested_form/builders.rb
@@ -161,7 +159,6 @@ files:
161
159
  - spec/dummy/tmp/cache/assets/E54/400/sprockets%2Fd0cbc16cc37efcf9dc41f242b5dbbf81
162
160
  - spec/dummy/tmp/cache/assets/EB7/AB0/sprockets%2F801d29a5debdbfbfb4eef14d70d9bcdb
163
161
  - spec/dummy/tmp/cache/assets/F48/5E0/sprockets%2F26cd6ffcffbebbe2fd6cd1a8f0c2debc
164
- - spec/dummy/tmp/capybara/capybara-201208212241496415482929.html
165
162
  - spec/events_spec.rb
166
163
  - spec/form_spec.rb
167
164
  - spec/nested_form/builder_spec.rb
@@ -170,45 +167,33 @@ files:
170
167
  - vendor/assets/javascripts/jquery_nested_form.js
171
168
  - vendor/assets/javascripts/prototype_nested_form.js
172
169
  - CHANGELOG.rdoc
170
+ - CONTRIBUTING.md
173
171
  - Gemfile
174
172
  - LICENSE
175
173
  - Rakefile
176
174
  - README.md
177
- has_rdoc: true
178
175
  homepage: http://github.com/ryanb/nested_form
179
176
  licenses: []
180
-
181
177
  post_install_message:
182
178
  rdoc_options: []
183
-
184
- require_paths:
179
+ require_paths:
185
180
  - lib
186
- required_ruby_version: !ruby/object:Gem::Requirement
181
+ required_ruby_version: !ruby/object:Gem::Requirement
187
182
  none: false
188
- requirements:
189
- - - ">="
190
- - !ruby/object:Gem::Version
191
- hash: 3
192
- segments:
193
- - 0
194
- version: "0"
195
- required_rubygems_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
188
  none: false
197
- requirements:
198
- - - ">="
199
- - !ruby/object:Gem::Version
200
- hash: 19
201
- segments:
202
- - 1
203
- - 3
204
- - 4
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
205
192
  version: 1.3.4
206
193
  requirements: []
207
-
208
194
  rubyforge_project: nested_form
209
- rubygems_version: 1.6.2
195
+ rubygems_version: 1.8.23
210
196
  signing_key:
211
197
  specification_version: 3
212
198
  summary: Gem to conveniently handle multiple models in a single form.
213
199
  test_files: []
214
-
@@ -1,31 +0,0 @@
1
- <!DOCTYPE html>
2
- <html xmlns="http://www.w3.org/1999/xhtml"><head>
3
- <title>Dummy</title>
4
-
5
- <script type="text/javascript" src="/assets/jquery.js"></script>
6
- <script type="text/javascript" src="/assets/jquery_nested_form.js"></script>
7
- <script type="text/javascript" src="/assets/jquery_events_test.js"></script>
8
- </head>
9
- <body>
10
-
11
- <form method="post" id="new_project" class="new_project" action="/projects" accept-charset="UTF-8"><div style="margin:0;padding:0;display:inline"><input type="hidden" value="✓" name="utf8" /></div> <div class="fields"> <div class="fields">
12
- <input type="text" size="30" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][name]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_name" />
13
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][_destroy]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
14
- </div><div class="fields">
15
- <input type="text" size="30" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][name]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_milestones_name" />
16
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][milestones_attributes][new_1345578109485][_destroy]" id="project_tasks_attributes_new_1345578109395_tasks_milestones_attributes_new_1345578109485_milestones__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
17
- </div><a data-association="milestones" class="add_nested_fields" href="javascript:void(0)">Add new milestone</a>
18
- <input type="hidden" value="false" name="project[tasks_attributes][new_1345578109395][_destroy]" id="project_tasks_attributes_new_1345578109395__destroy" /><a data-association="tasks" class="remove_nested_fields" href="javascript:void(0)">Remove</a>
19
- </div><a data-association="tasks" class="add_nested_fields" href="javascript:void(0)">Add new task</a>
20
- </form><div style="display: none" id="tasks_fields_blueprint"><div class="fields"> <a data-association="milestones" class="add_nested_fields" href="javascript:void(0)">Add new milestone</a>
21
- <input type="hidden" value="false" name="project[tasks_attributes][new_tasks][_destroy]" id="project_tasks_attributes_new_tasks__destroy" /><a data-association="tasks" class="remove_nested_fields" href="javascript:void(0)">Remove</a>
22
- </div></div> <div style="display: none" id="milestones_fields_blueprint"><div class="fields">
23
- <input type="text" size="30" name="project[tasks_attributes][new_tasks][milestones_attributes][new_milestones][name]" id="project_tasks_attributes_new_tasks_milestones_attributes_new_milestones_name" />
24
- <input type="hidden" value="false" name="project[tasks_attributes][new_tasks][milestones_attributes][new_milestones][_destroy]" id="project_tasks_attributes_new_tasks_milestones_attributes_new_milestones__destroy" /><a data-association="milestones" class="remove_nested_fields" href="javascript:void(0)">Remove milestone</a>
25
- </div></div>
26
-
27
- <div id="console"><p>Added some field</p><p>Added task field</p><p>Added some field</p><p>Added milestone field</p><p>Added some field</p><p>Added milestone field</p></div>
28
-
29
-
30
-
31
- </body></html>