【问题标题】:Basic Rails 404 Error Page基本 Rails 404 错误页面
【发布时间】:2010-11-29 16:15:06
【问题描述】:

很长一段时间以来,我一直在寻找一个简单的答案,而这似乎必须如此明显和简单,因为没有人有一个简单的、白痴证明的教程。

无论如何,我想做的就是拥有一个 404.html 静态页面,只要抛出任何错误,它就会加载。理想情况下,这应该只发生在生产和登台阶段。

我觉得这应该是最容易做的事情……但我想不通。

非常感谢任何帮助。

【问题讨论】:

标签: ruby-on-rails routing http-status-code-404


【解决方案1】:

我相信,如果您在生产模式下运行,那么只要 URL 没有路由,就会提供公共目录中的 404.html。

【讨论】:

    【解决方案2】:

    无论何时抛出任何错误,您都不会收到 404,因为并非所有错误都会导致 404。这就是为什么您的公共目录中有 404、422 和 500 个页面的原因。我猜 Rails 认为这些是最常见的错误。就像 Ben 说的,当它找不到东西时会出现 404,当应用程序抛出错误时会出现 500。在两者之间,您可以覆盖很多基础。

    【讨论】:

      【解决方案3】:

      在你的ApplicationController

      unless  ActionController::Base.consider_all_requests_local
        rescue_from Exception, :with => :render_404
      end
      
      private
      
        def render_404
          render :template => 'error_pages/404', :layout => false, :status => :not_found
        end
      

      现在设置 error_pages/404.html 就可以了

      ...或者我对 Exception 过于谨慎,你应该从 RuntimeError 中拯救出来。

      【讨论】:

      • 感谢您的回答,我还想补充一点,我发现有一篇关于这个主题的深入文章perfectline.co.uk/blog/…
      • 它应该可以工作,尽管文档说你应该使用Rails.application.config.consider_all_requests_local 而不是ActionController::Base.consider_all_requests_local
      • 您的应用程序中的任何错误现在都将返回 404,而不是正确的 500... 并且路由错误将无法挽救,请参阅rails.lighthouseapp.com/projects/8994/tickets/… 虽然我猜这就是他所问的真的不应该这样做:) 我使用 nginx 规则为 /images 中找不到的任何内容抛出 404。
      • 路由文件应该放什么?
      【解决方案4】:

      如果您在生产模式下运行,则公共目录中的 404.html,500.html,422.html 文件会在发生相应错误时提供服务,将显示上面的页面。

      在 Rails 3.1 中

      我们可以像下面这样使用: Rails 3.1 将自动生成带有正确 HTTP 状态代码的响应(在大多数情况下,这是 200 OK)。您可以使用 :status 选项来更改:

      渲染 :status => 500

      渲染 :status => :forbidden

      Rails understands both numeric and symbolic status codes.

      Fore more information see this page

      干杯!

      【讨论】:

        【解决方案5】:

        另一种方法是使用以下内容配置您的config/application.rb

        module YourApp
          class Application < Rails::Application
            # ...
        
            config.action_dispatch.rescue_responses.merge!(
              'MyCustomException' => :not_found
            )
          end
        end
        

        因此,每当MyCustomException 被引发时,Rails 都会将其视为普通的:not_found,渲染public/404.html

        要在本地进行测试,请确保将 config/environments/development.rb 更改为:

        config.consider_all_requests_local = false
        

        阅读更多关于config.action_dispatch.rescue_responses.

        【讨论】:

          【解决方案6】:

          这就是我的做法。在我的application_controller.rb:

          def render_404
            render file: 'public/404.html', layout: false, status: :not_found
          end
          

          然后,在我想要渲染 404 的任何控制器中,我执行以下操作:

          @appointment = Appointment.find_by(id: params[:appointment_id]) || render_404
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 1970-01-01
            • 2015-06-22
            • 1970-01-01
            • 1970-01-01
            • 2016-06-24
            • 2016-05-31
            相关资源
            最近更新 更多