带有茧 rails 的嵌套表单在编辑时会复制子项
Nested form with cocoon rails duplicates child items when editing
嵌套表单在创建新记录时效果很好。但是,当我编辑记录时,它会创建重复的子项,即使我并不打算添加新项。
如何防止它在更新销售订单时创建新的子项目?
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
,否则它会认为您要创建一个新的.
所以需要在子参数中允许id:
:sales_order_items_attributes => [:id, ...]
并确保您以触发此操作的表单提交。
嵌套表单在创建新记录时效果很好。但是,当我编辑记录时,它会创建重复的子项,即使我并不打算添加新项。
如何防止它在更新销售订单时创建新的子项目?
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
,否则它会认为您要创建一个新的.
所以需要在子参数中允许id:
:sales_order_items_attributes => [:id, ...]
并确保您以触发此操作的表单提交。