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

有人知道如何以一种形式保存多个对象吗?

  •  1
  • Trip  · 技术社区  · 14 年前

    新的 一对一形式的对象 预先存在的

    - form_for :parent_object do |f|
    

    这是我状态的开始。然后在里面,我会:

      - 2.times do
        - fields_for :child_object do |f|
    

    父对象控制器

    因此,如果我想呈现适当的保存操作,我必须这样设置:

    - form_for [@parent_object, @child_object] do |f|
      - 2.times do
        - fields_for :child_object do |f|
    

    只有 保存最后一个子对象。

    我的问题是,你怎么能救很多人 一对一形式的对象 父对象?

    我广泛地阅读了Ryan Bate的工作,以及许多其他博客和相关文章。似乎没有什么真正指向为一个预先存在的父对象创建新的子对象。

    我觉得必须切换父对象的控制器操作 def update

      elsif params[:parent_object][:child_object]
        @child_object = Child_Object.new(params[:child_object])
        if @child_object.valid? && @parent_object.referrals << @child_object
          redirect_to new_parent_object_child_object_path(@parent_object)
        else
          render :action => :new
        end
    

    在调试器中,如果我将调试器放在 def更新

    >> params[:parent_object]
    #=> nil
    

    有趣!这意味着,当子对象发送到父对象控制器时,不会为其填写参数。哈哈,不知道该怎么办。。

    不幸的是,代码不起作用,这只是我试图接近。;)

    2 回复  |  直到 12 年前
        1
  •  1
  •   Matt    14 年前

    好吧,我们再试试。代码取自 RB's screencast 使用替换的对象名称:

    <% form_for @parent_object do |f| %>  
      <%= f.error_messages %>  
      <!-- some field of parent object here -->
      <p>  
        <%= f.label :name %><br />  
        <%= f.text_field :name %>  
      </p>  
      <% f.fields_for :child_objects do |builder| %>  
      <!-- some fields for child objects -->
      <p>  
        <%= builder.label :content, "Some content for child object" %><br />  
        <%= builder.text_area :content, :rows => 3 %>  
        <%= builder.check_box :_destroy %>  
        <%= builder.label :_destroy, "Remove child object" %>  
      </p>  
      <% end %>  
      <p><%= f.submit "Submit" %></p>  
    <% end %>
    

    这是一张 @parent_object :child_objects . 当然,您必须用自己的字段替换字段。

    def new  
      @parent_object = ParentObject.new  
      3.times { @parent_object.child_objects.build }  
    end 
    

    edit 方法,你会:

    def edit  
      @parent_object = ParentObject.find(params[:id])
      3.times { @parent_object.child_objects.build }  
    end
    

    要使其工作,需要为子对象定义嵌套属性:

    class ParentObject < ActiveRecord::Base  
      has_many :child_objects, :dependent => :destroy  
      accepts_nested_attributes_for :child_objects
    end    
    

    中的更新方法 parent_object_controller.rb

    def update
      @parent_object = ParentObject.find(params[:id])
      if @parent_object.update_attributes(params[:parent_object])
        flash[:notice] = "Successfully updated parent object."
        redirect_to @parent_object
      else
        render :action => 'edit'
      end
    end
    

    但多亏了 accepts_nested_attributes_for 在ParentObject中,也将创建嵌套实例。

    source code for this episode 来自github。

        2
  •  0
  •   Community chadoh    7 年前

    你可以看看 this answer 我提出了一个类似的问题。有两种选择:使用单独的表单,或使用单个表单。

    你只需要改变 moderate_names_path 到父模型实例的正确路径(当然还有要修改的字段集)。你可以用它 polymorphic_path :

    polymorphic_path([@parent_object, @child_object])