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.

Était-ce utile?

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.

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