我有一个包含多个after_commit
回调的模型。如果任何回调引发异常,则将跳过所有其他回调。
我想确保所有回调都已运行(即使一个失败),而没有使用begin
& rescue
。
有办法吗?我查看了CallbackChain
的{{3}}选项,但这种情况似乎并不合理
class Order < ActiveRecord::Base
after_commit :a, :b
def a() puts 'in a' end
def b() puts 'in b'; fail 'Bad callback' end
end
在这种情况下,回调a
将无法运行:
>> Order.create!
in b
[ERROR] Bad callback
答案 0 :(得分:0)
忽略after_commit回调中的异常,以便它们不会干扰其他回调。
在你的情况下,'a'中没有打印,因为你的“a”函数没有打印字符串,它只是返回字符串。您忘了使用puts
def a() 'in a' end
应为def a() puts 'in a' end
根据文档(http://guides.rubyonrails.org/v3.2/active_record_validations_callbacks.html):
保证在事务块中创建,更新或销毁所有模型的after_commit和after_rollback回调。如果在其中一个回调中引发任何异常,它们将被忽略,以便它们不会干扰其他回调。