2010-09-06 8 views
6

Estoy intentando crear una aplicación de Rails en la que puede editar el mismo modelo desde varias ubicaciones diferentes en la página. Quiero que los cambios se guarden automáticamente cada X segundos, con la opción de activar manualmente un guardado.Rieles: GoogleDocs-Style Autoguardar

He encontrado una solución, pero parece muy complicada, y supongo que otros usuarios de Rails ya se han enfrentado a preguntas similares.

La solución que surgió, es tener un formulario oculto en mi página que es el que en realidad se envió, y luego tener múltiples formularios "falsos" diseminados por la página que actualizan el formulario oculto.

Una vez enviado, el formulario oculto actualiza el modelo y el modelo contiene lógica para determinar qué archivos RJS se deben devolver en respuesta. Estos se incluyen y se envían como una respuesta de actualización.

algunas limitaciones:

  • No se puede envolver toda la página en una etiqueta de formulario (hay varios modelos/controladores en la página)
  • El mismo campo podría ser editable desde múltiples ubicaciones

¿Alguien tiene una manera más eficiente?

Respuesta

3
  • crear tanto la forma como usted necesita en su página par de la misma instancia del mismo modelo
  • desencadenar la actualización sería ya sea una llamada setInterval JavaScript o onBlur en sus campos de formulario.
  • su controlador debe ser REST, y devolverá mensajes de error o éxito en las variables json y un estado HTTP (200, 422)
  • Olvide rjs, piense en el lado del cliente. Cada formulario en su página enviará el formulario al método de actualización de su controlador. El javascript que envía el formulario tendrá un error o una devolución de llamada exitosa que luego mostrará los mensajes de error o de éxito. La idea es que el javascript que envía el formulario "sabe" qué formulario está enviando actualmente, y debe poder mostrar el error o el éxito por sí mismo dependiendo del formulario que está enviando, no es el trabajo del controlador.
  • Guardar toda la página es simplemente serializar todos los campos de todos los formularios y enviarlos al método de actualización. (Consulte serialize)
+0

1. ¿Cómo evitaría los conflictos de ids entre los campos de entrada? Recuerde que quiero permitir editar el mismo campo en varias ubicaciones diferentes – shmichael

+0

2. ¿Cómo me ocupo de actualizar todas las representaciones de un campo de formulario actualizado sin usar RJS? No quiero actualizar toda la página para una actualización de campo individual. – shmichael

+0

para 1. puede pasar un parámetro: id a su ayudante de entrada. <% = f.text_field: name,: id => 'bla'%> Depende de usted cuidar su identificación para evitar colisiones. Tal vez pueda prefijarlos por el nombre del formulario – hellvinz