2008-10-14 12 views
5

estoy teniendo un modelo bastante complejo con muchos campos, has_many asociaciones, imágenes agregadas por image_column etc ...formas de varias páginas en rieles

el nuevo objeto se agregará por una forma de varias páginas (8 pasos) - ¿Cómo debo realizar la validación y la propagación entre esos pasos?

Creo que validation_group podría ser útil para definir validaciones para cada paso, ¿qué pasa con el diseño general?

Respuesta

6

Para el diseño general, puede considerar el concepto de capa de presentador (Jay Fields lo define en su entrada de blog Rails: Presenter Pattern) como una forma de mantener sus controladores delgados y las vistas estúpidas cuando se trata de modelos complejos/múltiples.

4

Puede tener una serie de métodos, p. step_1, step_2, y cada uno verifica que se hayan enviado los datos necesarios del paso anterior. Puede almacenar datos en la sesión para que, por ejemplo, el paso 3 aún tenga acceso a todos los datos recopilados y analizados en el paso 1. En el paso final, coloque todos los datos que haya almacenado en la sesión más los datos desde el penúltimo paso a usar, y crea una nueva fila en la base de datos o lo que sea que estés recopilando los datos. Si un usuario daña un paso, redirigirlos al paso anterior y completar el formulario para ellos con los datos que completaron; p.ej. si el usuario daña el paso 2 y envía el formulario que lleva al paso 3, detecta el problema en su método step_3, redirige al usuario al método step_2 y asegúrese de que los elementos del formulario en el paso 2 estén previamente llenos.

Si no desea almacenar datos en la sesión sobre la marcha, puede crear una nueva fila de la base de datos después de que el usuario haya enviado el paso 1 y simplemente actualice los campos en esa fila a medida que reúne datos nuevos en cada sucesivo paso. Puede tener un indicador para 'completar' en la fila, inicialmente configurándolo en 0 y luego configurándolo en 1 después de que el usuario haya completado con éxito todos los pasos.

También podría permitir a los usuarios ir a los pasos anteriores (por ejemplo, dejar que el usuario regrese al paso 3 cuando esté en el paso 5).

Supongamos que su primer paso tiene un formulario con campos 'nombre' y 'correo electrónico'. En su método step_2, debe verificar que se pasaron params[:name] y params[:email] y son válidos. Almacene aquellos en la sesión o en una fila de la base de datos, como usted elija. Luego, en el paso 2, tiene un formulario con campos 'edad' y 'género'. En su método step_3, debe verificar que se aprobaron params[:age] y params[:gender] y que son válidos, y también debe asegurarse de que el usuario haya completado el paso 1 para evitar que el usuario ingrese la URL para acceder directamente al paso 3. Y así.

+0

Estoy utilizando este método porque mi formulario contiene campos de carga de archivos. Es mucho más fácil seguir esta ruta que lidiar con una sesión, en mi caso. –

0
class Campaign < ActiveRecord::Base 
    with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can| 
     spam_can.validates_associated :spam_can 
     spam_can.validates_presence_of :spam_can 
    end 
    def on_or_past_step 
    : 
    : 
    end 
end 

esto es un trabajo en progreso, pero siento que estoy en el camino correcto. Estoy usando AASM estados para determinar qué validaciones ejecutar. Todavía no he averiguado cómo deberían funcionar las rutas, ya que el modelo en cuestión en mi caso es un recurso. por ejemplo, ¿qué grupo de campos debería ser la acción de edición?

Cuestiones relacionadas