Rails不会触发我的after_commit回调

时间:2012-10-26 09:41:32

标签: ruby-on-rails activerecord

您好,我有一个特殊的问题。我使用after_commit回调来发送通知,但似乎根本没有触发回调。简化情况如下:

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    raise 'Doing something'
  end
end

然后我打算在打开控制台并创建消息时看到加注。但没有任何反应。此外,如果我完全删除'do_something'方法,rails甚至不会抱怨。请注意,这不是使用事务夹具的测试。我甚至看到了数据库中提交的记录。我的rails版本是3.0.9。感谢任何帮助,特别是如果它是好的: - )

编辑:我后来了解到,当我将代码部署到另一台机器时,会触发回调DID。所以它必须是我的设置。我仍然很感激你对可能导致这种情况的看法。

Edit2:来自评论。

  • 数据库是MySQL,因此存在交易。
  • 指定回调的操作没有帮助(:on =&gt;:create)。
  • 我需要after_commit而不需要其他回调

6 个答案:

答案 0 :(得分:5)

David在问题评论中提到了这种行为的解释。

Transaction Callbacks documentation

  

“如果在其中一个回调中引发任何异常,他们会   被忽略,以便它们不会干扰其他回调。如   这样,如果你的回调代码可以引发异常,你需要   救援并在回调中妥善处理。“

另见:

答案 1 :(得分:2)

您可能需要在规范/支持中添加补丁,以便在使用事务处理程序时启用after_commit回调。如果您正在使用事务夹具,那么实际上并不会发生提交。

补丁:https://gist.github.com/charleseff/1305285

答案 2 :(得分:1)

一个可能的原因(至少在5.0上)是:

after_commit :do_something, on: :create
after_commit :do_something, on: :destroy

这里do_something被引用了两次,将不会执行任何操作。一旦合并到

after_commit :do_something, on: [:create, :destroy]

它将再次被调用。

答案 3 :(得分:0)

您必须在必须触发此after_commit时指定操作....

after_commit基本上用于那些存在交易概念的数据库中......所以请尝试以下代码......

class Message < ActiveRecord::Base
 after_commit :do_something, :on => [:create, :update, :destroy]

 def do_something
  raise 'Doing something'
 end
end

答案 4 :(得分:0)

尝试以下代码有帮助 -

class Message < ActiveRecord::Base
 after_commit :do_something, :only => [:create, :update, :destroy]

 def do_something
  raise 'Doing something'
 end
end

答案 5 :(得分:-2)

您有以下内容:

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    puts 'Doing something'
  end
end

您可以尝试使用after_createafter_save,具体取决于您的需求。

after_commits刚执行时记录成功保存在数据库中,因为保存,保存!并且在交易中销毁。

如文档中所示:Active Record Callbacks