Obtenir les validations d'un modèle Rails
-
05-07-2019 - |
Question
Étant donné qu'un modèle contient des validations dans le fichier nom_modèle.rb, comment puis-je accéder à ces validations manuellement? J'aimerais créer mon propre système de validation de formulaire qui fonctionnerait parallèlement aux astuces de Rails intégrées et je souhaite que tout soit aussi sec que possible. Mon problème principal est que je dois effectuer des validations côté serveur avant qu'aucune valeur de formulaire ne soit affectée à la base de données (j'utilise un formulaire à plusieurs étapes).
En gros, je me demande s’il existe une méthode comme
User.validations.each do |v|
puts v.constraint.to_s + " " + v.message
end
Y a-t-il quelque chose de similaire à cela?
Merci d'avance.
La solution
Mon principal problème est que je dois faire validations côté serveur avant aucune des les valeurs de formulaire frappent la base de données (je suis en utilisant un formulaire en plusieurs étapes).
Si votre modèle n'est pas valide selon les validations de son fichier de classe, ses données ne seront pas enregistrées dans la base de données (sauf si vous transmettez false
à save
méthode pour supprimer les validations).
- Vous pouvez demander à un modèle s'il est valide à tout moment en appelant ses méthodes
valides?
/non valides?
.
Autres conseils
L'objet ActiveRecord expose la méthode errors après valid? est appelé, ce qui vous donne des messages sur les validations qui sont violées. Vous pouvez vérifier valide? puis vérifiez si l'un des champs de la partie du formulaire sur laquelle vous vous trouvez est invalide. vous pouvez faire quelque chose comme ceci pour un formulaire avec les champs field1 et field2.
unless x.valid?
[:field1,:field2].each do |field|
yes_there_was_an_error if x.errors[field]
end
end
Votre meilleur choix est d'utiliser une machine à états et de stocker les données dans la base de données entre les différentes étapes du formulaire.
Vous pouvez faire par exemple validates_presence_of: nom d'utilisateur,: if = > proc {| u | u.signup_step > = 2}
, où signup_step
est une colonne entière de la base de données.
Ainsi, même si vous dites ne pas vouloir le stocker dans la base de données entre les formulaires, je pense que vous devriez le faire. Si vous faites cela, vous pouvez utiliser des validations et des modèles réguliers, sans fioritures. Et honnêtement, je doute que le faire de cette façon soit un problème.