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
的代码,您可以找到它存储要删除的记录列表的位置。
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
的代码,您可以找到它存储要删除的记录列表的位置。