【问题标题】:how to rescue from AbstractController::ActionNotFound exception in Rails 5?如何从 Rails 5 中的 AbstractController::ActionNotFound 异常中拯救?
【发布时间】:2017-01-17 16:18:37
【问题描述】:

在我的应用程序控制器中,我正在从一堆不同的异常中解救出来,以毫无问题地显示我自己的错误页面。例如:

rescue_from ActiveRecord::RecordNotFound, with: :not_found
rescue_from ActionView::MissingTemplate, with: :server_error
# etc...

但是以下方法不起作用:

rescue_from AbstractController::ActionNotFound, with: :not_found

我的理解是,在我们到达我的应用程序控制器以便能够拯救它之前,AbstractController 中引发了异常。

我也希望能够从这个异常中解救出来,但我无法找到可行的解决方案。
我尝试通过以下方式向路由器发送异常:

config/application.rb

config.exceptions_app = self.routes

在 config/routes.rb 中

get "*any", via: :all, to: "application#not_found"

这不起作用,似乎是 Rails 3 和 4 最常见的答案。我正在使用 Rails 5.0.0,感谢任何帮助

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:

    聚会迟到了,但我到这里是在寻找一种方法来提供仍然使用我的布局的“静态文件”,但如果有任何我没有的请求,则显示 404 页面,以防万一其他人正在寻找相同的东西,这就是我所做的:

    我最终制作了一个新控制器,其中只有一个动作来处理任何一种情况:

    # app/controllers/static_controller.rb
    class StaticController < ApplicationController
        def static_or_404
            render params[:static]
        rescue ActionView::MissingTemplate
            render :not_found
        end
    end
    

    然后在我的路由的最底部:

    # config/routes.rb
    get '*static', to: 'static#static_or_404'
    

    在你的情况下,你可以跳过静态部分,然后你就不必救援,你可以在动作中调用你的not_found。对于不同的用例,您可以重定向到您的根目录或其他东西。

    【讨论】:

      【解决方案2】:

      我今天必须解决同样的问题。这可能不是所有场景的最佳方式,但对我来说效果很好。这是我所做的:

      在 Rails 5 中,我们得到了其他控制器继承的 ApplicationController。这意味着您可以使用经典的 ruby​​ 继承方法来捕获所有控制器中可能不存在的操作并使用漂亮的 404 处理它们。

      这是一个例子:

      class ApplicationController < ActionController::Base
        def index
          show_nice_404
        end
      
        def show
          show_nice_404
        end
      
        # new, edit, etc..
        # you can also use alias if you like
      
        private
      
        def show_nice_404
          render 'some/404.html', layout: false, status: :not_found
        end
      end
      

      同样,由于这是 ApplicationController 并且所有其他控制器都继承自它,因此合法操作将简单地覆盖您在此处定义的操作,如果未覆盖,它将产生 404 页面。

      注意:我只为常见的 RESTful 操作执行此操作,但您可以使用 method_missing 进行尝试,尽管我会在尝试之前确保您的测试套件是可靠的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2018-11-27
        • 2014-08-19
        相关资源
        最近更新 更多