编辑时,带有茧形导轨的嵌套表单会复制子项

问题描述

在创建新记录时,嵌套表单非常有用。但是,当我编辑记录时,即使我无意添加新项,它也会创建重复的子项。

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

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

解决方法

要让Rails知道您正在编辑现有的sales_order_item,您需要在请求中提供其id,否则会认为您打算创建一个新的:sales_order_items_attributes => [:id,...]

因此,您需要在子参数中允许使用id: main()

并确保您以触发此操作的形式提交它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...