在before_action短路自定义404页面处理程序中引发异常

时间:2014-04-13 13:28:51

标签: ruby-on-rails-4

我成功使用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引发异常并仍然有自定义错误页面处理?有没有更好的方法来实现这一目标?

1 个答案:

答案 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是一个简单的例子)