在Rails 4中将status_code添加到自定义异常

时间:2014-10-24 14:38:25

标签: ruby-on-rails exception ruby-on-rails-4 exception-handling

配置/ application.rb中:

config.exceptions_app = self.routes

config.action_dispatch.rescue_responses.merge!(
  'Errors::UnauthorizedException' => :unauthorized
)

应用程序/控制器/ errors_controller.rb

class ErrorsController < ActionController::Base
  layout 'application'

  def show
    @exception = env["action_dispatch.exception"]
    @status_code = params[:code] || ActionDispatch::ExceptionWrapper.new(env, @exception).status_code
    render @status_code.to_s, :status => @status_code
  end
end

配置/ routes.rb中

%w( 404 422 500 401 ).each do |code|
  get code, :to => 'errors#show', :code => code
end

我在这里缺少什么?如果我去/:代码,我会得到正确的答案。如果我转到Rails将抛出404或500的页面,我会得到正确的响应。但是,如果我尝试raise Errors::UnauthorizedException,我将获得500而不是401.如何将我想要的状态代码附加到此例外?

1 个答案:

答案 0 :(得分:1)

我遇到了完全相同的情况,在我的情况下修复非常简单。我无法解释它,但根据你定义Error类的方式和位置,它可能是一个&#34;顶级常量&#34; (至少那是我的日志所说的)。

所以而不是:

config.action_dispatch.rescue_responses.merge!(
  'Errors::UnauthorizedException' => :unauthorized
)

config.action_dispatch.rescue_responses.merge!(
  'UnauthorizedException' => :unauthorized
)