Перехват ошибок Rails 3.1

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я думаю, что Rails 3.1 меняет способ возникновения ошибок. Кто-нибудь может помочь или подтвердить это? Я пытаюсь создать пользовательские страницы ошибок с Rails 3.1.0.rc1

 unless config.consider_all_requests_local
    rescue_from Exception, :with => :render_error
    rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
    rescue_from ActionController::RoutingError, :with => :render_not_found
    rescue_from ActionController::UnknownController, :with => :render_not_found
    rescue_from ActionController::UnknownAction, :with => :render_not_found
end
  

^^ Это не работает.

 config.consider_all_requests_local       = true
  

Это в моей среде разработки по умолчанию. Я предполагаю, что Rails 3.1 удаляет «action_controller», но я нигде не могу это подтвердить.

Спасибо!

Комментарии:

1. Какого рода ошибки? Просто исключения в целом?

2. Было бы полезно, если бы вы могли опубликовать некоторый код и объяснить, что конкретно , какое неожиданное поведение вы видите.

Ответ №1:

Я предполагаю, что следующий код отображается в вашем ApplicationController?

 unless config.consider_all_requests_local
  rescue_from Exception, :with => :render_error
  rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
  rescue_from ActionController::RoutingError, :with => :render_not_found
  rescue_from ActionController::UnknownController, :with => :render_not_found
  rescue_from ActionController::UnknownAction, :with => :render_not_found
end
  

Если это так, попробуйте заменить эту строку:

 unless config.consider_all_requests_local
  

с этой строкой (я думаю, до Rails 3):

 unless ActionController::Base.consider_all_requests_local
  

или это (после Rails 3):

 unless Rails.application.config.consider_all_requests_local
  

Ответ №2:

Я не верю, что решение Мэтта отловит ошибки маршрутизации в Rails 3.0 / 3.1.

Попробуйте поместить в свое приложение следующее.rb:

 # 404 catch all route
config.after_initialize do |app|
  app.routes.append{ match '*a', :to => 'application#render_not_found' } unless config.consider_all_requests_local
end
  

Смотрите: https://github.com/rails/rails/issues/671#issuecomment-1780159

У меня хорошо сработало!

Комментарии:

1. Спасибо за добавление этого! Узнал об этом через несколько недель после публикации моего первоначального ответа здесь . 🙂

2. в общем, вещи, которые в конечном итоге эквивалентны if ! Rails.env.production опасны…

3. @Kevin — Где это происходит? Связано ли это с использованием consider_all_request_local ? Если это так, я не думаю, что вы приводите допустимый аргумент, поскольку это параметр, определенный для каждой среды. Для каждой среды настроено множество параметров, и это лишь один из многих.

4. Прошло некоторое время, но я согласен и отзываю свою жалобу 🙂