在任何失败情况下,如何在 Rails 上显示带有 Ruby 的自定义错误页面?
How can I display a custom error page with Ruby on Rails in any failure case?
我知道如果在我的主应用程序中出现异常,我可以使用 exceptions_app
配置属性来提供动态错误页面。
但是,如果此错误页面是动态的,它也可能会失败。在我的例子中,我正在与主应用程序共享一些显示逻辑,碰巧该逻辑是异常的来源,并且呈现错误页面再次引发它。然后,我的最终用户看到了 Passenger 错误页面,它全是紫色的,怪异而可怕。
如何向我的用户可靠地显示自定义错误页面,可能使用静态页面回退?
实际上有一系列配置开关和重定向可能性,具体取决于您的堆栈。
这是一个显示所有可能性的决策流程图。如果你有一个动态错误页面,你真的应该在 public/500.html
中添加它的静态渲染,并将它符号链接到其他文件并在你的网络服务器中引用那个文件(在图中,Apache 的 ErrorDocument
).
您不能简单地直接服务 public/<HTTP status code>.html
。事实上,Web 服务器随后会将 /<HTTP status code>
请求视为对静态页面的请求,并且我们的错误控制器将不再触发 Rails 路由,抢占动态错误显示。
您应该将config.action_dispatch.show_exceptions
设置为false
(more details),并禁用您的app runner(图中的Passenger)错误页面,否则您将泄漏异常内容。
如果您想达到那个级别的细节,在用户隐藏的、自愿损坏的页面上添加集成测试非常重要,因为您正在禁用一些调试和故障安全功能。
参考资料
您可能还对以下参考资料感兴趣:
- Base tutorial 对于 Rails 中的动态错误页面。
- 如果你想use your main app to display errors.
CustomErrorsHandler
是一个 gem,它会自动尝试使用 <HTTP status code>.erb
模板并回退到静态 public/<HTTP status code>.html
页面。
- 如何通过precompiling Rails Static 404 and 500 Pages自动呈现静态版本。
我知道如果在我的主应用程序中出现异常,我可以使用 exceptions_app
配置属性来提供动态错误页面。
但是,如果此错误页面是动态的,它也可能会失败。在我的例子中,我正在与主应用程序共享一些显示逻辑,碰巧该逻辑是异常的来源,并且呈现错误页面再次引发它。然后,我的最终用户看到了 Passenger 错误页面,它全是紫色的,怪异而可怕。
如何向我的用户可靠地显示自定义错误页面,可能使用静态页面回退?
实际上有一系列配置开关和重定向可能性,具体取决于您的堆栈。
这是一个显示所有可能性的决策流程图。如果你有一个动态错误页面,你真的应该在 public/500.html
中添加它的静态渲染,并将它符号链接到其他文件并在你的网络服务器中引用那个文件(在图中,Apache 的 ErrorDocument
).
您不能简单地直接服务 public/<HTTP status code>.html
。事实上,Web 服务器随后会将 /<HTTP status code>
请求视为对静态页面的请求,并且我们的错误控制器将不再触发 Rails 路由,抢占动态错误显示。
您应该将config.action_dispatch.show_exceptions
设置为false
(more details),并禁用您的app runner(图中的Passenger)错误页面,否则您将泄漏异常内容。
如果您想达到那个级别的细节,在用户隐藏的、自愿损坏的页面上添加集成测试非常重要,因为您正在禁用一些调试和故障安全功能。
参考资料
您可能还对以下参考资料感兴趣:
- Base tutorial 对于 Rails 中的动态错误页面。
- 如果你想use your main app to display errors.
CustomErrorsHandler
是一个 gem,它会自动尝试使用<HTTP status code>.erb
模板并回退到静态public/<HTTP status code>.html
页面。- 如何通过precompiling Rails Static 404 and 500 Pages自动呈现静态版本。