10

你好我有一个特殊的问题。我使用 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 被触发。所以这一定与我的设置有关。不过,我仍然希望您能深入了解造成这种情况的原因。

编辑2:来自评论。

  • 数据库是 MySQL,因此存在事务。
  • 指定回调的操作没有帮助(:on => :create)。
  • 我需要 after_commit 而没有其他回调
4

6 回答 6

7

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

事务回调文档

“如果在其中一个回调中引发任何异常,它们将被忽略,这样它们就不会干扰其他回调。因此,如果你的回调代码可能引发异常,你需要拯救它并处理它适当地在回调中。”

也可以看看:

于 2013-09-03T12:52:29.230 回答
7

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

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

这里do_something被引用了两次,没有一个会被执行。一旦它结合到

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

它会再次被调用。

于 2018-11-20T13:35:18.533 回答
3

您可能需要在您的规范/支持中添加一个补丁,以在使用事务性固定装置时启用 after_commit 回调。如果您使用的是事务装置,那么实际上不会发生提交。

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

于 2013-03-15T06:44:55.740 回答
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
于 2012-10-26T10:49:04.150 回答
0

试试下面的代码是否有帮助 -

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

 def do_something
  raise 'Doing something'
 end
end
于 2012-10-26T11:48:58.243 回答
-2

您有以下内容:

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    puts 'Doing something'
  end
end

您可以尝试after_createafter_save根据您的需要。

after_commits 只是在记录成功保存到数据库时执行,因为保存,保存!并销毁在事务中运行。

如文档中所述:Active Record 回调

于 2012-10-26T10:10:51.207 回答