生成422错误的错误页面

时间:2017-01-10 20:50:40

标签: ruby-on-rails ruby ruby-on-rails-4 routes http-status-code-422

我目前正在为500和404错误生成动态错误页面。我想将此扩展为422错误。这是我们到目前为止所拥有的。

配置/ application.rb中

config.exceptions_app = self.routes

控制器/ errors_controller.rb

class ErrorsController < ApplicationController
  def not_found
    render status: 404
  end

  def internal_server_error
    render status: 500
  end

  def unacceptable
    render status: 422
  end
end

的routes.rb

get '/404' => 'errors#not_found'
get '/500' => 'errors#internal_server_error'
get '/422' => 'errors#unacceptable'

public / 422.html页面已被删除。已创建错误视图页面,但为简洁起见省略了这些页面。引发404或500错误时,将显示错误页面。但是,当我收到422错误时,我收到以下错误页面。

enter image description here

我见过很多教程实现了同样的方法,但它确实有用。但是,我收到生成的Rails错误,而不是我创建的错误页面。怎么了,怎么解决这个问题?

教程我看过:

1 个答案:

答案 0 :(得分:3)

我是另一位与@ jason328合作过的开发人员。事实证明这是一个多部分问题,首先是一般422错误,然后是Rails引发ActiveRecord::InvalidAuthenticityToken并且没有呈现适当页面的特定情况。

1。一般422错误

Rails错误页面

我们通过设置config.consider_all_requests_local = false在我们的本地开发环境中暂时摆脱了这一点。但是,我们没有获得自定义错误页面,而是获得了一个空白页面。

空白页

根据this Stack Overflow question,我们需要match '/422', to: 'errors#unprocessable_entity', via: :all代替get '/422' => 'errors#unprocessable_entity'

此时,通用422错误按预期执行。我们设置了一个控制器操作,一旦您点击它就会引发ActiveRecord::InvalidAuthenticityToken,并呈现我们的自定义422页面。因此,对于一般只遇到422错误的人来说,上面的内容应该包括你。

2。 InvalidAuthenticityToken

但是,由于422错误的常见原因实际上是在野外发生InvalidAuthenticityToken错误,因此似乎值得描述我们所看到的其余问题。在应用程序生成自己的InvalidAuthenticityToken错误的实际情况中,我们现在收到的是纯文本500错误,而不是我们的自定义422页。

纯文字500错误

我们能够将此跟踪到ActionDispatch::ShowExceptions#render_exception中的FAILSAFE_RESPONSE。这就是Rails抛出异常并将其转换为[status, body, headers]响应数组的地方。如果在此期间抛出另一个异常,而不是陷入无限循环,它会放弃并返回FAILSAFE_RESPONSE。在这种情况下,在汇总响应时会抛出另一个InvalidAuthenticityToken错误。

此时,是:rescue_from策略的时候了:

rescue_from ActionController::InvalidAuthenticityToken,
            with: :rescue_invalid_authenticity_token

def rescue_invalid_authenticity_token
  #...notify services as if this error weren't being rescued

  redirect_to '/422'
end

通过重定向确保我们免受同一请求中的任何更多InvalidAuthenticityToken错误的影响。