2013 обновление для Rails 3.2 с Хосе Валим
Когда вышел Rails 3.0, одна из особенностей, которую люди вдруг упустили, это способность лучше обрабатывать исключения. Проблема заключалась в том, что так как Rails 3 стал намного более «беглым» в Rack, нам пришлось перенести некоторые функции в стек промежуточного программного обеспечения, и это заставило нас перенести также обработку всех исключений. Rails 3.2 пытается вернуть некоторые настройки в игру, позволяя вам установить свое собственное приложение стойки исключений, которое вызывается в случае сбоя. Например, вы можете установить приложение исключений на свой собственный маршрутизатор в вашем config / application.rb:
config.exceptions_app = self.routes
Теперь, каждый раз, когда возникает исключение, ваш маршрутизатор будет вызываться. Поэтому, чтобы отобразить пользовательские 404 страницы, вы можете просто добавить к вашему маршрутизатору:
match "/404", :to => "errors#not_found"
И реализовать логику в контроллере, как вы хотите! Однако, если вы пойдете по этому пути, следует помнить несколько вещей:
- Вам нужно использовать совпадение в ваших маршрутах, а не получать / отправлять / помещать / удалять
потому что такие исключения могут произойти в любом HTTP-запросе;
- Вы не сможете увидеть ваши собственные исключения в разработке
если вы не установите config.consider_all_requests_local в false в вашем
конфигурации / среда / development.rb. Причина в том, что если запрос
считается локальным, Rails всегда предпочитает показывать отладку
страница исключений; [или запустить
rails server -e production
]
- Вы всегда можете получить доступ к исходному исключению в контроллере по адресу
окр [ "action_dispatch.exception"];
- Невозможно установить куки, ни сеанс, ни вспышку после
исключение случается. Все они уже были сериализованы обратно в
клиент;
- Наконец, приложение исключений по умолчанию, используемое Rails, которое
просто отображает страницу в общедоступном / STATUS.html доступен здесь:
action_dispatch / промежуточный / public_exceptions.rb
Помните, что что бы вы ни делали в контроллере ошибок, оно не должно быть чем-то «причудливым». Будьте проще, потому что с вашим приложением что-то пошло не так!