如何从Rails 5中的AbstractController :: ActionNotFound异常中解救?

时间:2016-09-09 13:36:06

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

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

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

但以下情况不起作用:

rescue_from AbstractController::ActionNotFound, with: :not_found

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

我希望能够从这个例外中解脱出来,但我还没能找到有效的解决方案。
我尝试通过执行以下操作向路由器发送异常:

配置/ 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并感谢任何帮助

2 个答案:

答案 0 :(得分:0)

晚些时候参加聚会,但是我在寻找提供“静态文件”的方式时仍然来到这里,该“静态文件”仍然使用我的布局,但是如果我没有其他要求,则显示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。对于不同的用例,您可以重定向到您的根目录或其他内容。

答案 1 :(得分:-1)

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

在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,但我会在尝试之前确保您的测试套件是可靠的。