Formulaires multi-pages dans Rails
-
03-07-2019 - |
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?
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?