Как использовать rescue_from с Rails 6? - PullRequest
1 голос
/ 19 апреля 2020

Очевидно, rescue_from должен перехватывать исключения, но это не работает должным образом:

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

  def not_found
    text: 'Not found'
  end
end

Spe c:

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

Rails 6.0. 2

Почему RoutingError нельзя использовать с rescue_from? RoutingError вызывается в промежуточном программном обеспечении или маршрутизатором до вызова контроллера? Есть ли другой способ поймать RoutingError?

1 Ответ

2 голосов
/ 19 апреля 2020

Ошибки маршрутизатора возникают до того, как они попадают в контроллер, вы можете использовать маршрутный символ, который будет соответствовать чему-либо, что не совпадает с другими маршрутами в конце файла rout.rb - точки, которая направляет к указанному c действию контроллера.

Что-то вроде:

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

(Не пробовал, может понадобиться немного подправить, но я думаю, идея ясна)

...