5

Esta es mi primera publicación aquí, así que espero que publique esta pregunta en el lugar correcto. De lo contrario, hágamelo saber para saber la próxima vez que publique aquí :)Ruby on Rails -HTTP error handling

Estoy trabajando en un sitio web RoR y me gustaría manejar los errores del servidor (400, 404, 500, etc.) individualmente. Además, dado que el sitio web es dinámico, me gustaría manejar los errores dentro del entorno de los rieles en lugar de a nivel del servidor. Un ejemplo de lo que me gustaría hacer podría ser presentar al usuario material opcional o una barra de búsqueda cuando se topa con una página o plantilla que no se carga o simplemente no existe.

Soy nuevo en RoR así que, por favor, desnudo conmigo en caso de que pregunte lo obvio.

Por lo tanto, leí un poco y creo que usar el manejador de excepciones rescue_from es el camino a seguir en mi caso. (Estaría más que feliz de saber si alguno de ustedes tiene una opinión diferente).

Tengo un simple prototipo de trabajo (véase el código de abajo) en funcionamiento, sin embargo, me sale un error cuando se incluyo el siguiente gestor de excepciones al código:

rescue_from ActionController::MissingTemplate,   :with => :not_found #404 

Ahora, no puedo ver que tengo un error de ortografía y he visto esta línea en el código publicado en la web. Sin embargo, cuando lo incluyo me sale el siguiente error de enrutamiento:

Routing Error No route matches "/errorhandle" with {:method=>:get} 

estoy trabajando en los carriles 2.3.5, tal vez eso tiene algo que ver con eso?

Espero que pueda ayudarme a arrojar algo de luz sobre este tema.

¡Salud! /Maja

class ApplicationController < ActionController::Base 

    helper :all # include all helpers, all the time 

    protect_from_forgery #See ActionController::RequestForgeryProtection for details 

    #ActiveRecord exceptions 
    rescue_from ActiveRecord::RecordNotFound, :with => :not_found #400 

    #ActiveResource exceptions 
    rescue_from ActiveResource::ResourceNotFound, :with => :not_found #404 

    #ActionView exceptions 
    rescue_from ActionView::TemplateError, :with => :not_found #500 

    #ActionController exceptions 
    rescue_from ActionController::RoutingError, :with => :not_found #404 

    rescue_from ActionController::UnknownController, :with => :not_found #404 

    rescue_from ActionController::MethodNotAllowed, :with => :not_found #405 

    rescue_from ActionController::InvalidAuthenticityToken, :with => :not_found #405 

    rescue_from ActionController::UnknownAction, :with => :not_found #501 

    # This particular exception causes all the rest to fail.... why? 
    # rescue_from ActionController::MissingTemplate, :with => :not_found #404 

    protected 
    def not_found 
     render :text => "Error", :status => 404 
    end 

    # Scrub sensitive parameters from your log 
    # filter_parameter_logging :password 
end 
+1

¿Puede mostrarnos las rutas relevantes de routes.rb, si las hay? – Trevoke

+0

Sure Trevoke, gracias por la respuesta rápida. No he agregado nada a routes.rb así que supongo que esto es más o menos el estándar. file: ActionController :: Routing :: Routes.draw do | map | map.resources: errorhandlers # ... # un montón de líneas comentadas # ... map.connect ': Controlador /: action /: id' map.connect ': controller /: action/: id.: formato ' final –

+0

uh, no estoy seguro de cómo hacer que el comentario se vea bien y ordenado * uark *. Espero que sea legible de todos modos ... –

Respuesta

2

echar un vistazo rápido a las siguientes: http://www.ruby-forum.com/topic/47898

http://henrik.nyh.se/2008/09/404-invalid-rails-format

En particular, un puesto en el primer link:

You can't use a regular 'rescue' keyword to rescue MissingTemplate exception.

Use rescue_action instead, for example:

def rescue_action(exception) 
    if ::ActionController::MissingTemplate === exception 
    render :text => 'rescued' 
    else 
    super 
    end 
end 

Kent.

+0

Muchas gracias Kent por su respuesta y los enlaces, todos fueron muy útiles.Leeré sobre :: y el manejo de excepciones generales en RoR para comprender mejor su respuesta. ... y luego podría lanzar algunas preguntas más si no te importa? Por ahora, ¡gracias a todos ustedes, es genial ser parte de un foro tan activo! /Maja –

+0

No soy Kent - Kent fue quien respondió esa pregunta en el primer enlace :-) De nada. Por supuesto, haga más preguntas, ¡para eso es este sitio web! (solo lea el documento primero, por supuesto). – Trevoke