我成功使用this technique以编程方式将用户发送到自定义404页面,方法是在控制器中的before_action中提出RoutingError
,如果出现问题(例如,错误的参数):< / p>
before_action :check_invalid_params
def check_invalid_params
raise ActionController::RoutingError.new('Not Found') if params[:foo].present?
end
这在我的控制器中工作得很好,但我最近试图将一些常见的错误检查干扰到ApplicationController超类中,以便将before_action应用于所有我的控制器。
不幸的是,如果你从ApplicationController中的before_action回调中抛出一个异常,自定义错误页面处理会被短路,你最终会得到中间件生成的通用500错误(就像在this question上一样):
500 Internal Server Error
If you are the administrator of this website, then please read this web application's
log file and/or the web server's log file to find out what went wrong.
有没有办法从ApplicationController中的before_action引发异常并仍然有自定义错误页面处理?有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
如果您能够通过检查参数来处理它,我建议避免引发错误。所以对于你的情况我会这样做:
def check_invalid_params
render json:{error: 'foo not found'}, :status => 422 if params[:foo].present?
end
如果您调用可能失败的方法
def some_before_action
call_external_service
rescue
render json:{error: 'Internal Server Error'}, :status => 500
end
你可以在那时渲染你想要的任何东西(json是一个简单的例子)