[英]Rails 4: How to cancel save on a "before_save" callback?
我有复杂的模型/表格。 我不想重复记录,所以我想合并具有相似属性的记录。 如何使用 before_save 回调取消“保存”? 这就是我的想法:
class ProductsColor < ActiveRecord::Base
before_save :check_for_similar_record
def check_for_similar_record
if ProductsColor.exist?(color_id: self.color_id, product_id: self.product_id)
# merge values with existing ProductsColor and stop self from saving
end
end
end
从 Rails 5 开始,您可以通过在回调中显式调用throw :abort
来表示应该中止操作。 关于取消回调(现在)的文档部分指出:
如果
before_*
回调throws :abort
,所有后面的回调和相关的操作都会被取消。
以下关于交易的部分继续:
如果
before_*
回调取消了操作,则会发出ROLLBACK
。 您还可以触发ROLLBACK
在任何回调中引发异常,包括after_*
挂钩。
这个故事与 Rails 5 非常相似,只是回调应该返回false
。 文档的相应部分有助于说明
如果
before_*
回调返回 false,则所有后面的回调和相关操作都将被取消。 如果 after_* 回调返回 false,则后面的所有回调都将被取消。
其次是
如果 before_* 回调取消了操作,则会发出
ROLLBACK
。 您还可以触发 ROLLBACK 在任何回调中引发异常,包括 after_* 挂钩。
为了防止记录被保存,你应该简单地返回false
:
def check_for_similar_record
if ProductsColor.exists?(color_id: self.color_id, product_id: self.product_id)
# merge values
false
else
true
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.