2010-09-12 122 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

相关问题