可恢复的after_commit回调(Rails 3)

时间:2017-01-24 16:06:13

标签: ruby-on-rails callback

我有一个包含多个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

1 个答案:

答案 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回调。如果在其中一个回调中引发任何异常,它们将被忽略,以便它们不会干扰其他回调。