2010-09-12 58 views
2

在我的控制,我有一些代碼如下所示:Ruby on Rails:我如何捕獲ActiveRecord :: Rollback?

@mymodel.transaction do 
     for a in arr 
     @mymodel.some_method(a) 
     end 
    end 

在@爲MyModel#some_method我可以拋出一個ActiveRecord::Rollback例外,它在DB做的事情需要做,但是我再簡單地得到一個HTTP 500無法捕捉異常,讓用戶以優雅的方式知道出了什麼問題。

我試過用@ mymodel.transaction做一個開始/救援塊,但那也不行。捕捉異常的最佳方法是什麼,以便我可以向用戶提供正確的視圖?

+0

事務塊沒有捕獲回滾異常嗎?這就是它應該做的... – Matchu 2010-09-12 02:32:26

回答

1

ActiveRecord::Base文檔:

通常情況下,拋出異常會導致transaction方法來回滾數據庫事務通異常上。但是如果引發ActiveRecord :: Rollback異常,那麼數據庫事務將被回滾,而不會傳遞異常。

一個小例子:

class ThrowController < ApplicationController 
    def index 
     status = ActiveRecord::Base.connection.transaction do 
     raise ActiveRecord::Rollback.new 
     end 

     Rails.logger.info "followed transaction" 
    end 
end 

則:

>> c = ThrowController.new.index 
=> "followed transaction \n" 

正如你所看到的,ActiveRecord:::Rollback異常是由transaction塊吞噬。

在我看來,你的代碼正在發生其他事情,我們不知道。

+0

已經嘗試過,還沒有去,得到一個HTTP 500,因爲該異常沒有被處理。 – randombits 2010-09-12 02:36:32

+1

嘗試在交易區塊外開始營救 – 2010-09-12 03:53:05

+0

我用文檔中的一個更好的示例重新編寫了我的答案。我認爲我們需要更多的代碼來展示500錯誤。 – rjk 2010-09-12 15:09:16

相關問題