ruby on rails - Multi check_box on array field of child resource creates new items -


i trying create multiple checkbox tags second level embedded documents. however, creates new objects. have models

class paprasa   include mongoid::document    attr_accessible :id, :bkompetencijas, :bkompetencijas_attributes    accepts_nested_attributes_for :etapa   accepts_nested_attributes_for :bkompetencijas, :allow_destroy => true   embeds_many :bkompetencijas , class_name: 'kompetencija', inverse_of: :paprasabk,  :cascade_callbacks => true end #----------------------------------------------- class kompetencija   include mongoid::document    attr_accessible :id, :paprasabk, :paprasabk_attributes, :siekinys, :siekinys_attributes      accepts_nested_attributes_for :paprasa, :allow_destroy => true   accepts_nested_attributes_for :siekinys, :allow_destroy => true    embedded_in :paprasabk, class_name: 'paprasa', inverse_of: :bkompetencijas   embeds_many :siekinys, class_name: 'siekiny'  , inverse_of: :kompetencija, :cascade_callbacks => true end #----------------------------------------------- class siekiny   include mongoid::document   field :matricos_ids, :type => array, :default => []    attr_accessible :id, :kompetencija, :kompetencija_attributes, :matricos_ids    accepts_nested_attributes_for :kompetencija    embedded_in :kompetencija  , class_name: 'kompetencija', inverse_of: :siekinys end 

a form

<%= form_for  [@paprasa],:html => { :multipart => true} |f| %>     <%= f.fields_for :dkompetencijas |form_inner| %>          <%= form_inner.fields_for :siekinys |form_inner_inner| %>           <% @some_other_object.each_with_index |d,indexx| %>               <%= check_box_tag "#{field_name_for_js(form_inner_inner, "matricos_ids")}[]", d.id, form_inner_inner.object.matricos_ids.include?(d.id), :id => "#{field_id_for_js(form_inner_inner, "matricos_id_") << d.id.to_s}" ).to_s %>             <% end %>          <% end %>      <% end %> <% end %> 

where

def field_id_for_js(builder, attribute)       "#{builder.object_name}[#{attribute.to_s.sub(/\?$/,"")}]".gsub(/\]\[|[^-a-za-z0-9:.]/, "_").sub(/_$/, "")   end    def field_name_for_js(builder, attribute)       "#{builder.object_name}[#{attribute.to_s.sub(/\?$/,"")}]"   end 

it gives me ouput this

<input id="paprasa_dkompetencijas_attributes_0_siekinys_attributes_0_matricos_id_506567916226f718e50000cb" name="paprasa[dkompetencijas_attributes][0][siekinys_attributes][0][matricos_ids][]" type="checkbox" value="506567916226f718e50000cb" /> <input id="paprasa_dkompetencijas_attributes_0_siekinys_attributes_1_matricos_id_506567916226f718e50000cb" name="paprasa[dkompetencijas_attributes][0][siekinys_attributes][1][matricos_ids][]" type="checkbox" value="506567916226f718e50000cb" /> 

and parameters

{"paprasa"=>{"dkompetencijas_attributes"=>{"0"=>{"siekinys_attributes"=>{"0"=>{"id"=>"505adfd26226f7555a000191", "matricos_ids"=>["506567916226f718e50000cb"]}, "1"=>{"id"=>"507558176226f75fa5000033"}, "2"=>{"id"=>"512f19626226f765c7000071"}, "3"=>{"id"=>"512f36456226f765c70000c8"}}, "id"=>"505adfd26226f7555a000190"}}}, "user_id"=>"5058514b6226f73ae4000064", "etapa_id"=>"505851516226f73ae4000065"} 

this creates new "siekiny" objects instead of updating existing ones. doing wrong?

i ran problem recently. accepts_nested_attributes_for cannot(yet) decipher new parent object form whether create new child objects or find , update existing ones. if don't want child objects being duplicated when create new parent object have create custom setter method handle find_or_create you.

checkout this question solves problem overriding autosave associations.

or, checkout this question solves problem using reject_if , custom method.

another option solve problem break down hash in controller , object creating there instead of in model.


Comments

Popular posts from this blog

how to insert data php javascript mysql with multiple array session 2 -

multithreading - Exception in Application constructor -

windows - CertCreateCertificateContext returns CRYPT_E_ASN1_BADTAG / 8009310b -