带有茧栏杆的嵌套表单在编辑时会重复子项目

Posted

技术标签:

【中文标题】带有茧栏杆的嵌套表单在编辑时会重复子项目【英文标题】:Nested form with cocoon rails duplicates child items when editing 【发布时间】:2020-12-29 03:09:06 【问题描述】:

嵌套表单在创建新记录时效果很好。但是,当我编辑记录时,即使我不是要添加新项目,它也会创建重复的子项目。

如何防止它在更新销售订单时创建新的子项目?

class SalesOrderItem < ApplicationRecord
  belongs_to :item
  belongs_to :sales_order

class SalesOrder < ApplicationRecord
  has_many :sales_order_items, dependent: :destroy, inverse_of: :sales_order
  accepts_nested_attributes_for :sales_order_items


销售订单控制器(父级)

  def new
    @sales_order = SalesOrder.new
    @items = Item.all
    @customers = Customer.all
    @sales_order.sales_order_items.build
  end

  def edit
  end

  def update
    respond_to do |format|
      if @sales_order.update(sales_order_params)
        format.html  redirect_to @sales_order, notice: 'Sales order was successfully updated.' 
        format.json  render :show, status: :ok, location: @sales_order 
      else
        format.html  render :edit 
        format.json  render json: @sales_order.errors, status: :unprocessable_entity 
      end
    end
  end

-----------------------------------------------
def sales_order_params
      params.require(:sales_order).permit(:customer_id,
                                          :date,
                                          :user_id,
                                          :remarks,
                                          :vat_ex,
                                          :sales_order_items_attributes => [:item_id, :price, :quantity]
                                          )
 end

【问题讨论】:

【参考方案1】:

要让 rails 知道您正在编辑现有的 sales_order_item,您需要在请求中提供其 id,否则它会认为您要创建一个新的。

所以你需要在子参数中允许 id: :sales_order_items_attributes =&gt; [:id, ...]

并确保您以触发此操作的表单提交。

【讨论】:

以上是关于带有茧栏杆的嵌套表单在编辑时会重复子项目的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6嵌套形式茧不会保存子对象

编辑表单刀片 Laravel 中的嵌套循环

带有has_many的Rails嵌套表单:通过,如何编辑连接模型的属性?

如果对象在 Rails 6 中以嵌套形式不存在,如何创建对象?

如何使用茧宝石使用具有不同关系的嵌套形式?

Scala Play:如何使用重复值和嵌套值呈现表单映射?