Question

J'ai un modèle assez complexe comportant de nombreux champs, associations has_many , images ajoutées par colonne_image , etc.

.

Le nouvel objet sera ajouté par un formulaire de plusieurs pages (8 étapes) - Comment dois-je effectuer la validation et la propagation entre ces étapes?

Je pense que validation_group pourrait être utile pour définir des validations pour chaque étape. Qu'en est-il de la conception générale?

Était-ce utile?

La solution

Pour une conception globale, vous pouvez explorer le concept de couche de présentation (Jay Fields le définit dans son entrée de blog Rails: Modèle du présentateur ) afin de garder vos contrôleurs minces et d’avoir une vue stupide face aux modèles complexes / multiples.

Autres conseils

Vous pouvez avoir une série de méthodes, par exemple step_1 , step_2 , et chacun vérifie que les données nécessaires de l'étape précédente ont été soumises. Vous pouvez stocker des données dans la session de sorte que, par exemple, l'étape 3 puisse toujours accéder à toutes les données collectées et analysées à l'étape 1. À la dernière étape, mettez toutes les données que vous avez stockées dans la session plus les données. à partir de l'avant-dernière étape à utiliser, et créez une nouvelle ligne dans la base de données ou quoi que ce soit pour lequel vous collectez les données. Si un utilisateur gâche une étape, redirigez-le vers l'étape précédente et remplissez le formulaire pour lui avec les données qu'il a remplies. par exemple. si l'utilisateur complique l'étape 2 et soumet le formulaire menant à l'étape 3, identifiez le problème dans votre méthode step_3 , redirigez l'utilisateur vers la méthode step_2 et assurez-vous que les éléments de formulaire de l'étape 2 sont pré-remplis.

Si vous ne souhaitez pas stocker les données dans la session en cours, vous pouvez créer une nouvelle ligne de base de données après que l'utilisateur a soumis l'étape 1 et mettre à jour les champs de cette ligne au fur et à mesure que vous collectez de nouvelles données. . Vous pouvez avoir un indicateur de type "terminé" sur la ligne, en le définissant initialement à 0, puis en lui attribuant la valeur 1 une fois que l'utilisateur a terminé avec succès toutes les étapes.

Vous pouvez également autoriser les utilisateurs à passer aux étapes précédentes (par exemple, laissez-le revenir à l'étape 3 lorsqu'il passe à l'étape 5).

Supposons que votre première étape consiste en un formulaire avec les champs "nom" et "email". Dans votre méthode step_2 , vous devez vérifier que params [: nom] et params [: email] ont été passés et sont valides. Stockez ceux-ci dans la session ou dans une ligne de la base de données, quelle que soit votre choix. Ensuite, à l'étape 2, vous avez un formulaire avec les champs «âge» et «sexe». Dans votre méthode step_3 , vous devez vérifier que params [: age] et params [: genre] ont été transmis et sont valides. Vous devez vous assurer que l'utilisateur a terminé l'étape 1 pour empêcher un utilisateur d'entrer l'URL pour accéder directement à l'étape 3. Et ainsi de suite.

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

c’est un travail en cours, mais j’ai l’impression d’être sur la bonne voie. J'utilise les AASM pour déterminer les validations à exécuter. Je n'ai toujours pas compris comment les itinéraires devraient fonctionner, car le modèle en question dans mon cas est une ressource. Par exemple, quel groupe de champs doit être l’action d’édition?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top