在任何失败情况下,如何在 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设置为falsemore details),并禁用您的app runner(图中的Passenger)错误页面,否则您将泄漏异常内容。

如果您想达到那个级别的细节,在用户隐藏的、自愿损坏的页面上添加集成测试非常重要,因为您正在禁用一些调试和故障安全功能。

参考资料

您可能还对以下参考资料感兴趣: