shallow rails examples concern ruby-on-rails ruby routing

ruby-on-rails - concern - routes rails examples



¿La mejor forma de lidiar con RoutingError en Rails 2.1.x? (2)

Existe el método method_missing. Puede implementar eso en su Controlador de aplicación y capturar todas las acciones que faltan, tal vez registrarlas y redirigirlas a la acción de índice del controlador relevante. Este enfoque ignoraría todo lo que no se puede enrutar a un controlador, que es bastante parecido a lo que desea.

Alternativamente, solo registraría todos los errores, extraería la URL y la ordenaría por el número de veces que se produjo.

Estoy jugando con el código routing.rb en Rails 2.1, e intentando llegar al punto en el que puedo hacer algo útil con la excepción RoutingError que se lanza cuando no puede encontrar la ruta adecuada.

Este es un problema algo complicado, porque hay algunas clases de URL que son simplemente MALAS: los ataques de bot / azenv.php, las personas que tipean / bar / foo / baz en la URL, etc. ... no queremos ese.

Luego están los problemas sutiles de enrutamiento, donde queremos que nos avisen: / artists / por ejemplo, o ///. En estas situaciones, es posible que deseemos que se genere un error, o no ... u obtenemos que Google nos envíe URL que solían ser válidas pero que ya no existen porque la gente las eliminó.

En cada una de estas situaciones, quiero una forma de contener, analizar y filtrar la ruta que recibimos, o al menos alguna forma Railsy de administrar el enrutamiento más allá de la url ''cathall de repliegue'' normal. ¿Existe esto?

EDITAR:

Entonces el código aquí es:

# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 141 def rescue_action_without_handler(exception) log_error(exception) if logger erase_results if performed? # Let the exception alter the response if it wants. # For example, MethodNotAllowed sets the Allow header. if exception.respond_to?(:handle_response!) exception.handle_response!(response) end if consider_all_requests_local || local_request? rescue_action_locally(exception) else rescue_action_in_public(exception) end end

Por lo tanto, nuestra mejor opción es anular el log_error (excepción) para que podamos filtrar las excepciones de acuerdo con la excepción. Entonces en ApplicationController

def log_error(exception) message = ''...'' if should_log_exception_as_debug?(exception) logger.debug(message) else logger.error(message) end end def should_log_exception_as_debug?(exception) return (ActionController::RoutingError === exception) end

Salt para una lógica adicional donde queremos diferentes lógica de controlador, rutas, etc.


Nooooo !!! ¡No implemente method_missing en su controlador! Y por favor intenta evitar action_missing también.

El patrón frecuentemente promocionado es agregar una ruta:

map.connect ''*'', :controller => ''error'', :action => ''not_found''

Donde puede mostrar un error apropiado.

Rails también tiene un mecanismo llamado rescue_action_in_public donde puedes escribir tu propia lógica de manejo de errores: realmente deberíamos limpiarla y alentar a las personas a usarla. PDI! :-)