gpt4 book ai didi

ruby-on-rails - rescue_from ActionController::RoutingError 不起作用

转载 作者:行者123 更新时间:2023-12-04 01:23:41 25 4
gpt4 key购买 nike

我试图从 ActionController::RoutingError 营救我无法让它工作。我尝试了几乎所有可以在网上找到的东西,包括 rescue_from ActionController::RoutingError in Rails 4 .我有一个错误 Controller 和错误页面。我开始工作康康access deniedRecordNotFound ,但我可以解决RoutingError .

对于 cancan 我在里面使用这个 application_controller.rb

rescue_from CanCan::AccessDenied do
render template: 'errors/error_403', status: 403
end

我的 route 有这个:
match "/404", to: "errors#error_404", via: :all

如果我对 RoutingError 做同样的事情它不会工作。

我也试过 match '*path', :to => "errors#error_404"但我得到错误。

我该如何解决这个问题?

编辑:如果我对 RoutingError 做同样的事情至于拒绝访问:
    rescue_from ActionController::RoutingError do
render template: 'errors/error_404', status: 404
end

它不会工作。

最佳答案

ActionController::RoutingError当 Rails 尝试将请求与路由匹配时引发。这发生在 Rails 甚至初始化 Controller 之前 - 因此您的 ApplicationController 永远没有机会挽救异常。

相反,Rails 默认exceptions_app开始 - 请注意,这是 Rack 意义上的应用程序 - 它使用 ENV 散列和请求并返回响应 - 在这种情况下是静态 /public/404.html文件。

您可以做的是让您的 Rails 应用程序处理动态呈现错误页面:

# config/application.rb
config.exceptions_app = self.routes # a Rack Application

# config/routes.rb
match "/404", :to => "errors#not_found", :via => :all
match "/500", :to => "errors#internal_server_error", :via => :all

然后你将设置一个特定的 Controller 来处理错误页面 - 不要在你的 ApplicationController 类中这样做,因为你会添加一个 not_foundinternal_server_error所有 Controller 的方法!
class ErrorsController < ActionController::Base
protect_from_forgery with: :null_session

def not_found
render(status: 404)
end

def internal_server_error
render(status: 500)
end
end

代码借自 Matt Brictson: Dynamic Rails Error Pages - 阅读全文。

关于ruby-on-rails - rescue_from ActionController::RoutingError 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com