繁体   English   中英

Rails 4:如何取消“before_save”回调的保存?

[英]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

导轨 5

从 Rails 5 开始,您可以通过在回调中显式调用throw :abort来表示应该中止操作。 关于取消回调(现在)的文档部分指出:

如果before_*回调throws :abort ,所有后面的回调和相关的操作都会被取消。

以下关于交易的部分继续:

如果before_*回调取消了操作,则会发出ROLLBACK 您还可以触发ROLLBACK在任何回调中引发异常,包括after_*挂钩。

导轨 4

这个故事与 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM