在我的控制器中,我的代码如下所示:
@mymodel.transaction do
for a in arr
@mymodel.some_method(a)
end
end
@ mymodel中的#some_method我可以抛出一个ActiveRecord::Rollback
异常,它在db中做了它需要做的事情,然而我只是得到一个HTTP 500并且无法捕获异常让用户知道出了问题的优雅方式。
我尝试在开始/救援块中包装@ mymodel.transaction do,但这也不会。捕获异常的最佳方法是什么,以便我可以向用户显示正确的视图?
答案 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
例外。
在我看来,我们还没有意识到你的代码还有其他的东西。