ruby-on-rails - Ruby on Rails:如何捕获 ActiveRecord::Rollback?

标签 ruby-on-rails ruby

在我的 Controller 中,我的代码如下所示:

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

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

我试过将 @mymodel.transaction do 包装在开始/救援 block 中,但这也行不通。捕获异常以便我可以向用户呈现正确 View 的最佳方法是什么?

最佳答案

来自 ActiveRecord::Base 文档:

Normally, raising an exception will cause the transaction method to rollback the database transaction and pass on the exception. But if you raise an ActiveRecord::Rollback exception, then the database transaction will be rolled back, without passing on the exception.

一个小例子:

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 block 吞没。

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

关于ruby-on-rails - Ruby on Rails:如何捕获 ActiveRecord::Rollback?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3693501/

相关文章:

ruby-on-rails - 在 Rails 中获取当前路径名

ruby-on-rails - Gem libxml-ruby (1.1.4) 安装但在运行时失败

javascript - y 轴的 Highcharts 复选框

mysql - 如何使用 ActiveRecord 进行多项计算

ruby - 如何使用 Anemone 只抓取子文件夹

ruby - 你如何使用页面对象自动确认 ruby​​ 中的模态?

ruby - 回溯与正则表达式中的反向引用有何不同?

ruby-on-rails - 如果模型在深层命名空间中,set_table_name 不起作用 - Rails 2.3.14 中的错误?

ruby-on-rails - 通过包含字段名称的字符串变量引用模型字段?

ruby-on-rails - Google 联系人 API 401 错误 RestClient::Unauthorized