具有嵌套表单的assign_attributes的行为

时间:2015-02-12 05:54:53

标签: ruby-on-rails variable-assignment nested-forms

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

我有一个名为Order的模型:

class Order < ActiveRecord::Base

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

end

假设我创建了一个包含两个交货的订单。然后我打开“编辑顺序”表单(这是一个嵌套的表单,您可以看到两个嵌套的交付),然后删除其中一个交付,即“_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的预期行为是什么?理想情况下,我希望它删除已删除的传递,但不保存生成的对象/链接到数据库。

1 个答案:

答案 0 :(得分:0)

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

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