首页 > 解决方案 > 如何在 Rails 6 中使用rescue_from?

问题描述

显然rescue_from应该捕获异常,但这不能按预期工作:

class ApplicationController < ActionController::Base
  rescue_from ActionController::RoutingError, with: :not_found

  def not_found
    text: 'Not found'
  end
end

规格:

specify 'Not found' do
  visit '/zzz'
  expect(page.status_code).to eq 200
end
Failure/Error: visit '/zzz'

     ActionController::RoutingError:
       No route matches [GET] "/zzz"

在开发环境中的行为相同。

但是,挽救其他错误(例如)RuntimeError确实可以按预期工作。

文档:https ://apidock.com/rails/v6.0.0/ActiveSupport/Rescuable/ClassMethods/rescue_from

导轨 6.0.2

为什么不能RoutingError和 一起使用rescue_from?在调用控制器之前,RoutingError 是在中间件中引发还是由路由器引发?有没有其他方法可以捕捉RoutingError

标签: ruby-on-railsruby-on-rails-6

解决方案


在到达控制器之前会引发路由器错误,您可以在 routes.rb 文件末尾使用通配符路由来匹配与其他路由不匹配的任何内容,并将该点路由到特定控制器操作。

就像是:

match '*foo', to: 'application#not_found'

(没试过,你可能需要稍微调整一下,但我认为这个想法很清楚)


推荐阅读