Raíles: ¿alguna forma elegante de manejar los 404?

Tengo una aplicación de rieles que creé para un sitio antiguo que convertí de otro cms (en un lenguaje que no es de rieles, jeje). La mayoría de las páginas antiguas se asignan a las páginas nuevas mediante route.rb. Pero todavía hay algunos 404.

Soy un novato en rieles, así que pregunto si hay formas avanzadas de manejar 404. Por ejemplo, si estuviera programando en mi antiguo idioma, haría esto:

  • Obtenga la URL (script_name) a la que se estaba accediendo y analícela.
  • Realice una búsqueda en la base de datos de las palabras clave, identificadores, etc.que se encuentren en la nueva URL.
  • Si lo encuentra, redirija a la página (o si se encuentran varios registros, muéstrelos todos en una página de resultados y deje que el usuario elija). Con rieles probablemente querría hacer: status =>: moved_permanently, supongo.
  • Si no lo encuentra, muestre un 404.

¿Existen gemas / complementos o tutoriales que conozca que puedan manejar tal cosa, si es que es posible? ¿O puede explicar en un alto nivel cómo se puede hacer eso? No necesito una muestra de código completa, solo un empujón en la dirección correcta.

PD. Es una aplicación simple de rails 3 que usa un solo modelo de contenido.

preguntado el 08 de enero de 11 a las 22:01

Acerca de su 'PS', los modelos no tienen nada, realmente nada que ver con el enrutamiento. Los controladores se encargan de eso. :) -

2 Respuestas

Pon esto en rutas (después de cada otra ruta que tengas, esto capturará todas las URL)

match '*url' => 'errors#routing'

Y ahora, en el controlador de errores en la acción de enrutamiento, puede implementar cualquier lógica elegante que desee y representar una vista como siempre (es posible que desee agregar :status => 404 hasta el render llamada). La URL solicitada estará disponible en el controlador como params[:url].

Respondido el 09 de enero de 11 a las 03:01

Malvado, esto es justo lo que estaba buscando para dirigirme en la dirección correcta. ¡Muchas gracias! - José

Hay una forma fea de hacer esto:

render :file => "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404

Quizás alguien pueda venir con una mejor solución.

Respondido el 09 de enero de 11 a las 01:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.