Estoy desarrollando un sitio web de Rails 2.3.1. A lo largo del sitio web, necesito tener un formulario para crear publicaciones en varias páginas (página de inicio, página Crear publicaciones, página de publicación de publicaciones, página de lista de comentarios, etc.) baste decir que este formulario debe estar en muchas páginas servidas por una variedad de controladores). Cada una de estas páginas muestra una gran variedad de otra información que se recupera en el controlador/acción correspondiente. Por ejemplo, la página de inicio enumera las últimas 10 publicaciones, contenido extraído del DB, etc.La mejor práctica de Rails para tener el mismo formulario en varias páginas
Por lo tanto, he movido el formulario de creación de publicaciones a su propio parcial, e incluí este parcial en todas las páginas necesarias. Tenga en cuenta que el formulario en los POST Parciales a/preguntas (que se dirige a PostsController :: create - esto es el comportamiento predeterminado de los rieles).
El problema al que me estoy enfrentando es cuando el formulario Posts no se completa correctamente, de forma predeterminada el método PostsController :: create hace las preguntas/new.html.erb, incluso si el formulario se envió desde la página de inicio (/ home/index.html.erb).
He intentado cambiar el formulario en el parcial para enviar el "submitting_controller" y "submitting_action", y en PostsController :: create, when @ post.save? == falso, represento action => "../submitting_controller/submitting_action" (Lo cual es un poco hacky, pero te permite renderizar acciones de sitios que no sean de PostsController).
Esto parecía funcionar bien en la superficie. El formulario incompleto fue presentado en la vista que lo envió con todos los mensajes @ post.errors correctos, etc. El problema fue que TODO el resto de los datos en las páginas no aparecieron, porque los métodos actuales submitting_controller/submitting_action no fueron llamados, solo la vista asociada. (Recuerde, hice un render que conserva objetos de instancia, en lugar de un redirect_to que no conserva el objeto de instancia @post que tiene todos los mensajes de error y valores enviados.)
Por lo que puedo ver, tengo dos opciones :
1) Puedo almacenar el objeto @post en la sesión cuando @ post.save? falla en PostsController :: create, redirect_to submitting_controller/submitting_action, en cuyo punto saco el objeto @post de la sesión y lo uso para volver a llenar los mensajes de formulario/error. (Por lo que entiendo, el almacenamiento de objetos en la sesión es MALO la práctica en los rieles)
2) Puedo mover toda la lógica utilizada para extraer los datos del formulario de creación no post de los diversos submitting_controller/submitting_action, ponerlo en el ApplicationController, crea una declaración de conmutación gigante en PostsController :: create para submitting_controller/submitting_action y llama a los métodos en ApplicationController para obtener todos los datos adicionales necesarios para el procesamiento de cada página de envío.
¿Piensas en la mejor manera de hacer esto dentro de Rails?
Emfi, Buen punto acerca de los atributos anidados. Eso no se me había ocurrido. También es importante el punto que hace sobre el incumplimiento de JS. La sensación que tengo es que el que pregunta (a falta de un mejor manejo :) acabará perjudicando el rendimiento de la aplicación a través de la cantidad de acción DB que necesitaría para realizar la reconstitución de todos los objetos. – robertpostill
En esto estamos de acuerdo. Sin embargo, la diferencia entre no-javascript y AJAX suele ser una llamada link_to_remote, un RJS que representa una plantilla, y posiblemente una pequeña lógica de controlador para evitar las llamadas a la base de datos que normalmente haría. – EmFi
EmFi, Desafortunadamente, el modelo de publicación y los modelos cuyo controlador usará para representar el formulario pueden no estar relacionados. (HomeController no tiene un modelo de respaldo, incluso). Hago algunas comprobaciones en un mecanismo de captcha en PostController :: create (el campo captcha no es parte del Post Model, sino más bien de su propio módulo). Creo que tanto usted como Robertpostill tienen razón en AJAX es la forma de abordar este problema.Solo tengo que descubrir cómo hacerlo con jQuery (opté por no usar Prototype, personal pref) y no arruinar nada en Rails. – empire29