2012-09-03 55 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。 –