0

第 2 レベルの埋め込みドキュメント用に複数のチェックボックス タグを作成しようとしています。ただし、現在は新しいオブジェクトを作成するだけです。私はモデルを持っています

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

フォーム

<%= form_for  [@paprasa],:html => { :multipart => true} do |f| %>
    <%= f.fields_for :dkompetencijas do |form_inner| %>
         <%= form_inner.fields_for :siekinys do |form_inner_inner| %>
          <% @some_other_object.each_with_index do |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 %>

どこ

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

それは私にこのような出力を与えます

<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" />

およびパラメータ

{"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"}

これは、既存のオブジェクトを更新する代わりに、新しい「siekiny」オブジェクトを作成するだけです。私が間違っていることは何ですか?

4

2 に答える 2

1

私は実際に最近この問題に遭遇しました。Accepts_nested_attributes_for は、新しい子オブジェクトを作成するか、既存のものを見つけて更新するかを、新しい親オブジェクト形式で (まだ) 解読できません。新しい親オブジェクトを作成するときに子オブジェクトを複製したくない場合は、find_or_create を処理するカスタム セッター メソッドを作成する必要があります。

自動保存の関連付けをオーバーライドすることで問題を解決するこの質問をチェックしてください。

または、reject_ifとカスタム メソッドを使用して問題を解決するこの質問を確認してください。

この問題を解決する別のオプションは、コントローラー内のハッシュを分解し、モデル内ではなくコントローラー内ですべてのオブジェクト作成を行うことです。

于 2013-03-01T17:27:31.197 に答える
1

しかし、これは私にはうまくいきませんでした。一部のアクションでは、数回機能し、その後再び壊れました。私も試してみました@some_other_object side (このオブジェクトはから参照されpaprasa、新しいオブジェクトを作成し続けました。これを取得する唯一の方法は、コントローラーに「ハック」なものを入れることでしたが、これは本当に好きではありません。親オブジェクトを取得し、子を反復処理しましたparams の index を使用して、指定された配列フィールドを探し、子属性に割り当てられ、次に .save メソッドになります。今ではすべてが機能しますが、気に入らない...

于 2013-03-05T13:12:27.950 に答える