代码之家  ›  专栏  ›  技术社区  ›  Aitvaras

子资源的数组字段上的多个check_box创建新项目

  •  0
  • Aitvaras  · 技术社区  · 13 年前

    我正在尝试为二级嵌入文档创建多个复选框标记。然而,现在它只是创建新的对象。 我有模型

    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”对象,而不是更新现有的对象。我做错了什么?

    2 回复  |  直到 13 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    事实上,我最近遇到了这个问题。Accepts_nested_attributes_for(目前)无法使用新的父对象窗体来解密是创建新的子对象还是查找和更新现有的子对象。如果您不希望在创建新的父对象时复制子对象,则必须创建一个自定义的setter方法来处理find_or_create。

    结账 THIS 通过覆盖自动保存关联来解决问题的问题。

    或者,结账 THIS 通过使用reject_if和自定义方法来解决问题的问题。

    解决这个问题的另一个选项是分解控制器中的散列,并在那里而不是在模型中创建所有对象。

        2
  •  1
  •   Aitvaras    13 年前

    然而,这对我来说并不奏效。在一些动作中,它起了好几次作用,然后又坏了。我甚至试过 @some_other_object side (此对象引用自 paprasa 它只是不断地创建新的对象。我得到这个的唯一方法是在控制器里放一些“黑客”的东西,我真的不喜欢。 我取了父对象,使用params上的索引遍历子对象,以查找指定的数组字段,并将其分配给子属性,然后是.save方法。现在一切正常,但我不喜欢。。。

    推荐文章