Pregunta

Tengo un modelo bastante complejo con muchos campos, has_many , imágenes agregadas por image_column etc ...

El objeto Nuevo se agregará en un formulario de varias páginas (8 pasos). ¿Cómo debo realizar la validación y 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?

¿Fue útil?

Solución

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

Otros consejos

Podría 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 último paso, coloque todos los datos que haya almacenado en la sesión más los datos desde el penúltimo paso hasta su uso, y cree una nueva fila en la base de datos o para lo que sea que esté recopilando los datos. Si un usuario desordena un paso, redíbrelo al paso anterior y complete el formulario con los datos que completó; p.ej. Si el usuario desordena el paso 2 y envía el formulario que lleva al paso 3, detecte el problema con su método step_3 , redirija al usuario al método step_2 y asegúrese de que los elementos de formulario en el paso 2 se rellenan previamente.

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

También puede permitir que los usuarios sigan los pasos anteriores (por ejemplo, permitir que el usuario vuelva al paso 3 cuando está en el paso 5).

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

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

este es un trabajo en progreso, pero siento que estoy en el camino correcto. Estoy usando AASM para determinar qué validaciones se ejecutarán. Todavía no he descubierto 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?

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