在我的应用程序控制器中,我从一堆不同的异常中抢救出来,显示我自己的错误页面没有问题。例如:
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并感谢任何帮助
答案 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,但我会在尝试之前确保您的测试套件是可靠的。