Ruby on Rails:我如何捕获ActiveRecord :: Rollback?

时间:2010-09-12 02:24:52

标签: ruby-on-rails ruby

在我的控制器中,我的代码如下所示:

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

#some_method我可以抛出一个ActiveRecord::Rollback异常,它在db中做了它需要做的事情,然而我只是得到一个HTTP 500并且无法捕获异常让用户知道出了问题的优雅方式。

我尝试在开始/救援块中包装@ mymodel.transaction do,但这也不会。捕获异常的最佳方法是什么,以便我可以向用户显示正确的视图?

1 个答案:

答案 0 :(得分:2)

来自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例外。

在我看来,我们还没有意识到你的代码还有其他的东西。