Pregunta

Usando Rails v2.1, digamos que tiene una acción para un controlador al que se puede acceder desde más de una ubicación.Por ejemplo, dentro de la aplicación Rails, tiene un enlace para editar un usuario desde dos vistas diferentes, una en la vista de índice de usuarios y otra desde otra vista (digamos desde la barra de navegación en cada página).

Me pregunto cuál es la mejor manera de redirigir al usuario al lugar correcto según el enlace en el que hizo clic.Por ejemplo:

Ejemplo 1:

  1. Listar todos los usuarios
  2. Haga clic en "editar" en un usuario de la lista.
  3. El usuario hace clic en "guardar" en el formulario, el controlador lo redirige a 1.

Ejemplo 2:

  1. El usuario puede estar en cualquier página dentro de la aplicación, la barra de navegación muestra un enlace para editar el usuario actual
  2. El usuario hace clic en el enlace para editar.
  3. El usuario hace clic en "guardar" en el formulario, el controlador lo redirecciona a cualquier página en la que se encontraba cuando el usuario hizo clic en el enlace "editar" en la barra de navegación.

Lo he visto hecho en el pasado por:

  1. Colocar un parámetro en el enlace de edición original con el controlador/acción original en el que apareció el enlace.Para hacer esto más SECO, puedes usar @controller.controller_name y @controller.action_name en un asistente.
  2. El controlador guarda los parámetros en una variable de sesión.
  3. Una vez que el controlador ha guardado el registro, lo redirige a la variable de sesión.

Lo que no me gusta particularmente de esta solución es la necesidad de agregar el parámetro a cada enlace aplicable en las vistas.Me pregunto si hay alguna manera de integrar todo esto en el controlador.

Una mejor manera en la que estaba pensando era:

  1. Coloque un filtro before_filter en la acción "editar" para guardar la referencia (¿es lo suficientemente confiable?) en la sesión.
  2. Cuando se presiona "actualizar", el controlador redirigirá a la variable de sesión y luego eliminará la variable de sesión.

¿Alguna idea sobre la mejor manera de hacer esto?

¿Fue útil?

Solución

Creo que usar before_filter en la acción de edición es lo menos molesto.

El árbitro debe ser lo suficientemente confiable...simplemente tenga un valor predeterminado en el caso de que no haya ningún referente disponible (por ejemplo:alguien marcó la página de edición como favorita) y deberías estar bien.

Otros consejos

Destello:Los datos que utilizará sólo para la siguiente solicitud se pueden almacenar en la memoria flash.Entonces no es necesario que lo borre automáticamente.Funciona bien para fragmentos limitados del contexto de la aplicación que seguramente solo necesitará una vez, ¡no solo para mensajes de error!

Sé lo que hiciste el último acceso HTTP:Si solo necesita redirigir a las personas a la última URL en la que estuvieron, hágalo.request.referer, para la mayoría de los navegadores que no bloquean la información, le dará la última URL en la que estuvo la persona.

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

Por cierto, no sugeriría codificarlos.

filtro_antes:Veo a muchos desarrolladores de Rails usando esto como su martillo favorito y convirtiendo todo lo demás en clavos.Los filtros son útiles cuando desea exponer la funcionalidad a todos o sustancialmente a todos los métodos en un controlador.No sé que ese sea necesariamente el caso aquí, pero su kilometraje puede variar.Puede combinar el filtro con los dos trucos anteriores si es necesario.

Otro enfoque es cargar el formulario en una superposición, como http://flowplayer.org/tools/overlay/index.html, y luego, al enviar ajax, puede cerrar la superposición.Hago esto en combinación con un autocompletar para ofrecer una opción de "agregar nuevo".Una vez que se envía el formulario superpuesto, devuelvo algunos datos en json, sobre los cuales se actúa para completar el autocompletado.(Hice el mío propio enchufar para ayudar con todo eso)

Requiere un poco más de trabajo, pero realmente funciona bien para el usuario final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top