您好,我有一个特殊的问题。我使用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:来自评论。
答案 0 :(得分:5)
David在问题评论中提到了这种行为的解释。
Transaction Callbacks documentation
“如果在其中一个回调中引发任何异常,他们会 被忽略,以便它们不会干扰其他回调。如 这样,如果你的回调代码可以引发异常,你需要 救援并在回调中妥善处理。“
另见:
答案 1 :(得分:2)
您可能需要在规范/支持中添加补丁,以便在使用事务处理程序时启用after_commit回调。如果您正在使用事务夹具,那么实际上并不会发生提交。
答案 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_create
或after_save
,具体取决于您的需求。
after_commits刚执行时记录成功保存在数据库中,因为保存,保存!并且在交易中销毁。
如文档中所示:Active Record Callbacks