2013 actualización para Rails 3.2 de Jose Valim
Cuando salió Rails 3.0, una de las características que la gente de repente pasó por alto fue la capacidad de manejar mejor las excepciones. El problema era que, como Rails 3 se convertía en mucho más Rack "fluido", tuvimos que mover algunas características a la pila de middleware y esto nos obligó a mover todo el manejo de excepciones también. Rails 3.2 intenta devolver algo de personalización al juego permitiéndole configurar su propia aplicación de rack de excepciones que se invoca cuando ocurre una falla. Por ejemplo, se puede configurar la aplicación excepciones a su propio router en tu config/application.rb:
config.exceptions_app = self.routes
Ahora, cada vez que hay una excepción, el router va a ser invocado. Por lo tanto, para rendir 404 páginas, simplemente puede añadir a su router:
match "/404", :to => "errors#not_found"
y aplicar la lógica en el controlador como desee! Sin embargo, hay algunas cosas a tener en cuenta si vas por este camino:
- Es necesario utilizar coincidencia en sus rutas y no GET/POST/PUT/borrar debido a que tales excepciones pueden ocurrir en cualquier HTTP solicitud;
- No podrá ver sus excepciones personalizadas en el desarrollo a menos que configure config.consider_all_requests_local en false en su configuración config/environments/development.rb.El motivo es que si la solicitud es considerada local, Rails siempre preferirá mostrar la página de excepciones de depuración ; [o ejecute
rails server -e production
]
- Siempre puede acceder a la excepción original en el controlador al env ["action_dispatch.exception"];
- No es posible establecer cookies, la sesión ni el flash después de ocurre una excepción. Todos ellos ya estaban serializados de nuevo en el cliente ;
- Por último, la aplicación de excepciones por defecto utilizado por los carriles que simplemente despliega una página, en público/Status.html está disponible aquí: action_dispatch/middleware/public_exceptions.rb
Recuerde que cualquier cosa que hagas en los errores controlador, no debería ser algo "elegante". ¡Manténgalo simple porque algo ya salió mal con su aplicación!