Rails在我之后不开火

你好,我有一个奇怪的问题。 我使用after_commit回调来发送通知,但似乎回调没有被触发。 简化的情况如下所示:

class Message < ActiveRecord::Base
  after_commit :do_something

  def do_something
    raise 'Doing something'
  end
end

然后,当我打开控制台并创建消息时,我期望看到加注。 但没有任何反应。 此外,如果我完全删除'do_something'方法,rails甚至不会抱怨。 请注意,这不是使用交易装置的测试。 我甚至可以看到在db中提交的记录。 我的rails版本是3.0.9。 感谢任何帮助,特别是如果它很好:-)

编辑:我后来知道,当我将代码部署到不同的机器时,会触发回调DID。 所以它必须是我的设置。 不过,如果您对此有何看法,我会很感激。

编辑2:从评论。

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

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

    交易回调文档

    “如果在其中一个回调中发生任何异常,它们将被忽略,以免它们干扰其他回调。因此,如果您的回调代码可能引发异常,则需要将其解救并处理在回调中适当。“

    也可以看看:

  • Rails Github第3205期
  • 拉请求#11123

  • 在使用交易装置时,您可能需要在规格/支持中添加补丁以启用after_commit回调。 如果你正在使用交易装置,那么提交并不会真的发生。

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


    当这个after_commit必须被触发时,你应该指定动作....

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

    class Message < ActiveRecord::Base
     after_commit :do_something, :on => [:create, :update, :destroy]
    
     def do_something
      raise 'Doing something'
     end
    end
    
    链接地址: http://www.djcxy.com/p/11347.html

    上一篇: Rails does not fire my after

    下一篇: common lisp auto completion on aquamacs