assign_attributes 嵌套表单的行为

Behaviour of assign_attributes with nested forms

assign_attributes 删除嵌套对象时似乎无法识别。

我有一个名为订单的模型:

class Order < ActiveRecord::Base

    has_many :deliveries, :dependent => :destroy             
    accepts_nested_attributes_for :deliveries, :allow_destroy => true

end

假设我创建了一个有两次交货的订单。然后我打开 'edit order' 表单(这是一个嵌套表单,您可以在其中看到两个嵌套的交付),然后删除其中一个交付,即“_destroy”属性设置为 true。

那么,如果我这样做:

@order = Order.find_by_id(params[:id])
@order.assign_attributes(order_params)
logger.debug "@order.deliveries: #{@order.deliveries.inspect}"

我可以看到两次交货都嵌套在订单下。

但是,如果我这样做

@order = Order.find_by_id(params[:id])
@order.update_attributes!(order_params)
logger.debug "@order.deliveries: #{@order.deliveries.inspect}"

其中一个交付已按预期删除。

这是 assign_attributes 预期的行为吗?理想情况下,我希望它删除已删除的交付,但不将生成的 objects/links 保存到数据库中。

accepts_nested_attributes_for 通过回调处理删除。在您保存父记录(update_attributes 会这样做)之前,子记录不会消失。

如果您深入了解 accepts_nested_attributes_for 的代码,您可以找到它存储要删除的记录列表的位置。