【问题标题】:Ruby on Rails: how do I catch ActiveRecord::Rollback?Ruby on Rails:如何捕获 ActiveRecord::Rollback?
【发布时间】:2011-04-11 05:54:23
【问题描述】:

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

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

在@mymodel#some_method 中,我可以抛出ActiveRecord::Rollback 异常,该异常在数据库中完成了它需要做的事情,但是我只是得到一个HTTP 500 并且无法捕获异常以优雅地让用户知道出了什么问题。

我尝试将 @mymodel.transaction 包装在 begin/rescue 块中,但这也不行。捕获异常以便向用户呈现正确视图的最佳方法是什么?

【问题讨论】:

  • 事务块没有捕获回滚异常吗?这就是它应该做的……

标签: ruby-on-rails ruby


【解决方案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 块吞噬。

在我看来,您的代码发生了我们不知道的其他事情。

【讨论】:

  • 也试过了,还是不行,获取http 500,因为异常没有被处理。
  • 在事务块外尝试开始救援
  • 我用文档中的一个更好的例子修改了我的答案。我认为我们需要您提供更多显示 500 错误的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多