jquery - Rails Nested Attributes form_for for has_many with unlimited nested models using javascript -


so i've got pretty simple model nested attributes set up:

class property < activerecord::base   has_many :trees   accepts_nested_attributes :trees end 

then build them in controller:

class propertiescontroller < applicationcontroller    def new     @property = properties.new     @trees = @property.trees.build   end end 

and in view (using slim):

= form_for @property |p|   = p.text_field :name    .tree     = p.fields_for :trees |t|       = t.text_field :fruit       = t.select :quantity, (1..1000).to_a      = link_to 'add tree', new_properties_path, id: 'new-tree' 

and in js (coffeescript) file, bound click event of '#new-tree' anchor:

event.preventdefault() tree = $(event.target).parents('.tree') tree.after tree.clone(true) 

this works expect, when submit form, last tree params submitted. because in generated html of form_for this:

<input type="text" id="property_trees_attributes_0_fruit" name="property[trees_attributes][0][fruit]"> <select id="property_trees_attributes_0_quantity" name="property[trees_attributes][0][quantity]" class="valid">   <option value="1">1</option>   <option value="2">2</option>   <option value="3">3</option>   ... </select> 

and when clone html name , id 0 in it, though believe should 1 add additional tree params, etc.

i tried compensate js doing this:

event.preventdefault() tree = $(event.target).parents('.tree') clone = tree.clone() number = parseint(clone.find('input[type=text]').attr('id').match /[0-9]/) next = number + 1 clone = clone.html().replace /_(#{number})_|\[(#{number})\]/, next section.after clone 

the point of regex replace numbers between 2 underscores or 2 brackets, _0_ or [0]

my regex doesn't seem work though. replaces _0_ 1 , solution seems messy me anyways. make regex simpler, have worry changing value of select menu options.

any suggestions cleaning up? missing obvious?

the problem have you're duplicating dom elements - imo hack, you're not building objects need before-hand (won't persist data etc)

we've implemented "add fields f.fields_for" using ajax before - there's great tutorial here , railscast here


child_index

the answer question use child_index option in fields_for helper, , make use integer timestamp:

<% index = time.now.to_i %> <%= f.fields_for :trees, child_index: index |fields| %>     #your fields here <% end %> 

code

here's do:

#app/views/properties/new.html.erb <%= form_for @property |f| %>    <%= render partial: "trees_fields", locals: { f: f, child_index: time.now.to_i } %>    <%= link_to "new field", new_field_property_path %> <% end %>  #app/views/properties/_trees_fields.html.erb <%= f.fields_for :trees, child_index: child_index |trees| %>    <%= trees.text_field :your_attr %> <% end %>  #app/controllers/properties_controller.rb def new_field     @property = property.new     @property.trees.build     render "add_tree", layout: false end  #app/views/properties/add_tree.html.erb <%= form_for @property |f| %>       <%= render partial: "trees_fields", locals: {f: f, child_index: time.now.to_i} %> <% end %>   #app/assets/javascripts/application.js.coffee $ ->   $(document).on "click", "#add_tree", (e) ->      e.preventdefault();      $.ajax        url: '/messages/add_subscriber'        success: (data) ->               el_to_add = $(data).html()           $('#trees_form').append(el_to_add)        error: (data) ->           alert "sorry, there error!" 

Comments

Popular posts from this blog

Android layout hidden on keyboard show -

google app engine - 403 Forbidden POST - Flask WTForms -

c - Why would PK11_GenerateRandom() return an error -8023? -