我目前正在为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错误时,我收到以下错误页面。
我见过很多教程实现了同样的方法,但它确实有用。但是,我收到生成的Rails错误,而不是我创建的错误页面。怎么了,怎么解决这个问题?
教程我看过:
答案 0 :(得分:3)
我是另一位与@ jason328合作过的开发人员。事实证明这是一个多部分问题,首先是一般422错误,然后是Rails引发ActiveRecord::InvalidAuthenticityToken
并且没有呈现适当页面的特定情况。
我们通过设置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错误的人来说,上面的内容应该包括你。
但是,由于422错误的常见原因实际上是在野外发生InvalidAuthenticityToken
错误,因此似乎值得描述我们所看到的其余问题。在应用程序生成自己的InvalidAuthenticityToken
错误的实际情况中,我们现在收到的是纯文本500错误,而不是我们的自定义422页。
我们能够将此跟踪到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
错误的影响。