2012-09-03 137 views
19

简单的问题。我有一个ActiveRecord模型,我希望在记录保存后执行后处理。所以在模型中,我有一个queue_for_processing方法,它将一个作业粘贴到Resque队列中。为了在我的记录成功保存后执行此操作,我在模型中写入了以下内容:Rails:after_create停止异常保存

after_create :queue_for_processing 

很简单。我以为一切都按预期工作,除了昨天晚上我的redis服务器出现故障,事情出错了。我的期望是,该记录仍然可以保存,我可以手动处理这项工作。但是queue_for_processing方法抛出一个异常(预期的行为)并停止保存记录。

我误解了after_create的工作原理吗?或者,我的理解是否正确,发生了什么奇怪的事情?

谢谢。

回答

34

是的,这些回调都包含在交易中。

基本上,以下将导致回退:

  • 返回从before_save假或类似回调
  • 例外before_save或类似回调
  • 例外after_save或类似回调(after_create)

以下不会导致回滚:

  • 回报从after_save或类似的回调虚假
  • 例外after_commit

如果你不想异常引起回滚,使用after_commit

+1

太棒了,谢谢你的迅速反应。这也有帮助:http://rails-bestpractices.com/posts/695-use-after_commit –

+0

此外,感谢您向我介绍after_commit。我看到它是在Rails3中引入的,但我一定错过了备忘录。我喜欢学习新东西:-) –

+0

很好的解释!为简明起见+1。 –