为 422 错误生成错误页面
Generating the Error Page for a 422 Error
我目前正在为 500 和 404 错误生成动态错误页面。我想将其扩展为 422 个错误。这是我们目前所拥有的。
config/application.rb
config.exceptions_app = self.routes
controllers/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 错误,而不是我创建的错误页面。出了什么问题,我该如何解决?
我看过的教程:
我是与@jason328 一起从事此工作的另一位开发人员。事实证明这是一个 multi-part 问题,首先是一般的 422 错误,然后是 Rails 引发 ActiveRecord::InvalidAuthenticityToken
而未呈现适当页面的特定场景。
1。一般 422 错误
Rails 错误页面
我们通过设置 config.consider_all_requests_local = false
在我们的本地开发环境中暂时摆脱了这一点。但是,我们得到的不是我们的自定义错误页面,而是一个空白页面。
空白的白页
根据 ,我们需要 match '/422', to: 'errors#unprocessable_entity', via: :all
作为路线而不是 get '/422' => 'errors#unprocessable_entity'
。
此时,通用 422 错误已按预期执行。我们设置了一个控制器操作,当您点击它时它会立即引发 ActiveRecord::InvalidAuthenticityToken
,它会呈现我们的自定义 422 页面。因此,对于一般遇到 422 错误的人来说,以上内容应该涵盖了你。
2。无效的真实性令牌
但是由于 422 错误的一个常见原因实际上是在野外发生 InvalidAuthenticityToken
错误,因此似乎值得描述我们所看到的问题的其余部分。在应用生成自己的 InvalidAuthenticityToken
错误的实际情况下,我们现在收到 text-only 500 错误,而不是我们自定义的 422 页面。
Text-only 500 错误
我们能够将其追溯到 ActionDispatch::ShowExceptions#render_exception
. This is where Rails takes the exception that's been thrown and converts it to a [status, body, headers]
response array. If another exception gets thrown during that time, rather than getting caught in an endless loop, it gives up and returns the FAILSAFE_RESPONSE 中的 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
错误。
我目前正在为 500 和 404 错误生成动态错误页面。我想将其扩展为 422 个错误。这是我们目前所拥有的。
config/application.rb
config.exceptions_app = self.routes
controllers/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 错误,而不是我创建的错误页面。出了什么问题,我该如何解决?
我看过的教程:
我是与@jason328 一起从事此工作的另一位开发人员。事实证明这是一个 multi-part 问题,首先是一般的 422 错误,然后是 Rails 引发 ActiveRecord::InvalidAuthenticityToken
而未呈现适当页面的特定场景。
1。一般 422 错误
Rails 错误页面
我们通过设置 config.consider_all_requests_local = false
在我们的本地开发环境中暂时摆脱了这一点。但是,我们得到的不是我们的自定义错误页面,而是一个空白页面。
空白的白页
根据 match '/422', to: 'errors#unprocessable_entity', via: :all
作为路线而不是 get '/422' => 'errors#unprocessable_entity'
。
此时,通用 422 错误已按预期执行。我们设置了一个控制器操作,当您点击它时它会立即引发 ActiveRecord::InvalidAuthenticityToken
,它会呈现我们的自定义 422 页面。因此,对于一般遇到 422 错误的人来说,以上内容应该涵盖了你。
2。无效的真实性令牌
但是由于 422 错误的一个常见原因实际上是在野外发生 InvalidAuthenticityToken
错误,因此似乎值得描述我们所看到的问题的其余部分。在应用生成自己的 InvalidAuthenticityToken
错误的实际情况下,我们现在收到 text-only 500 错误,而不是我们自定义的 422 页面。
Text-only 500 错误
我们能够将其追溯到 ActionDispatch::ShowExceptions#render_exception
. This is where Rails takes the exception that's been thrown and converts it to a [status, body, headers]
response array. If another exception gets thrown during that time, rather than getting caught in an endless loop, it gives up and returns the FAILSAFE_RESPONSE 中的 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
错误。