[英]Ruby on Rails: how do I catch 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 do,但是也不会这样做。 捕获异常的最佳方法是什么,以便为用户提供正确的视图?
从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"
如您所见, transaction
块吞下了ActiveRecord:::Rollback
异常。
在我看来,我们还没有意识到你的代码正在发生的其他事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.