我的API控制器有时会抛出Pundit :: NotAuthorizedError,我想呈现具有错误代码403
的特定json响应。对于一般错误,我想渲染其他内容,状态为500
。
然而:render_error
救援总是抓住Pundit错误,因此我得到500
。为什么会这样,我该怎么做才能避免呢?如果我完全删除rescue_from StandardError...
,它可以正常工作。 (ActionController::ParameterMissing
工作正常,所以我猜它已经连接到继承,但我会假设它尝试按照代码中给出的顺序匹配异常类型。)
class Api::V1::BaseController < ActionController::API
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :render_not_authorized
rescue_from ActionController::ParameterMissing, with: :render_bad_request
rescue_from StandardError, with: :render_error
def render_not_authorized
....
end
def render_error
....
end
end
答案 0 :(得分:2)
查看它所声明的docs:
处理程序是继承的。它们从右到左,从下到上,在层次结构中向上搜索。 exception.is_a?(klass)成立的第一个类的处理程序是被调用的处理程序,如果有的话。
特别注意第一条评论(“将处理程序按照最通用的顺序定义到最具体的”),其中说明:
救援处理程序的定义越晚,优先级越高。
最后声明异常catch-all处理程序会产生副作用,阻止任何其他处理程序运行。