dimanche 27 novembre 2011

Validation des données en Rails

Nous avons vu dans les précédents billets comment créer un Model et comment y ajouter des données grâce aux migrations. Nous avons également vu comment générer des formulaires, qui vous permettront de remplir les données de votre Model. Aujourd'hui, il est temps d'aller plus loin: nous allons apprendre à vérifier que les données entrées par l'utilisateur correspondent bien à ce que vous souhaitez.

La logique est simple. Supposons que vous avez créé un formulaire pour votre utilisateur, afin qu'il renseigne son livre préféré, son film préféré, son âge et que sais-je d'autre encore. Vous souhaitez que certaines de ces informations soient obligatoires, d'autres non, et pour agrémenter le tout, vous assurer que l'utilisateur ne marque pas n'importe quoi et/ou essaie de pirater votre superbe site. Vous allez pour cela devoir vérifier avant l'enregistrement des données par le formulaire que tout correspond bien... mais comment faire?

Qui dit données dit Model. C'est donc dans votre fichier MonModel.rb que tout va se passer. Pour ma part, il s'agit de "Profil.rb".

Par défaut, le fichier ne contient rien et il n'est rien possible de modifier dans votre base de données. La première chose à faire consiste donc à préciser parmi vos données lesquelles sont accessibles et modifiables, grâce au bout de code suivant:

attr_accessible :livre_prefere, :film_prefere

où :livre_prefere et :film_prefere sont des données présentes dans la base de donnée "Profil".

La seconde étape va consister en l'écriture de vos validations: de quelle manière souhaitez-vous formater les données enregistrées ? Voulez-vous qu'il renseigne obligatoirement un nom de livre ou un nom de film, ou pas ? Quelle est la longueur minimale ou maximale attendue ? ... Bref ! Les choix sont multiples: libres à vous de décider lesquels vous semblent pertinents !

La validation d'une donnée commence simplement par ce bout de code:

 validates :livre_prefere

Vous aurez systématiquement besoin de ce "validates" pour chacune de vos données.

La suite varie en fonction de ce que vous souhaitez faire. Une validation très classique consiste à vérifier que le champ est bien rempli:

 validates :livre_prefere, :presence => true

Avec ce bout de code, si le champ "livre_prefere" de votre formulaire n'est pas rempli, le formulaire renverra une erreur: "Livre_prefere doit être rempli".

Si vous débutez complètement, il se peut que cet avertissement soit en anglais ! Pour y remédier, il existe des traductions françaises pour les messages d'erreur. Il suffit de copier-coller le code dans un fichier, et de l'enregistrer en .yml dans le dossier "config/locales" de votre projet! ;)
Libre à vous ensuite d'ajuster le tout à votre sauce !
Si vous optez pour cette option, sachez que les retraits en début de ligne sont composés d'espaces (touche espace appuyée plusieurs fois!), et non de tabulations...

Une autre validation très classique est ce qu'on appelle "la confirmation". Elle utilisée très souvent pour s'assurer que l'utilisateur ne s'est pas trompé en tapant son mot de passe lorsqu'il s'inscrit ou lorsqu'il souhaite le changer.
La confirmation est très pratique du point de vue du développeur Rails: la première, c'est qu'on n'a pas besoin de dupliquer les données uniquement pour vérifier que l'utilisateur a bien entré les mêmes choses dans les deux champs. La seconde, c'est que Rails se charge en plus de s'assurer que ce qui est entré dans les deux champs "jumeaux" sont identiques, sans avoir à inscrire plus de lignes de code ! (Quand même, si ce n'est pas merveilleux ?)

Supposons que je veuille que mon utilisateur tape deux fois le titre de son livre prefere. Dans mon Model, je n'ai qu'à ajouter le code suivant:

validates :livre_prefere, 
:presence => true,:confirmation => true

Rails, pour la donnée "livre_prefere", va ainsi créer le champ de confirmation ":livre_prefere_confirmation" et s'assurer que ce qui y est inscrit est identique au champ ":livre_prefere". Pour que ça marche bien, assurez-vous bien sûr d'ajouter si ce n'est fait dans votre formulaire ce champ et ce label ! :)

La troisième validation qui à mon sens est presque indispensable est le format des réponses attendues. Par exemple, s'il s'agit d'une date, qu'elle soit de type "12/02/1986", et qu'elle ne ressemble pas à "ml/fd/fdsz"... Dans le jargon des programmeurs, on fabrique ce qu'on appelle des "Regular expressions" ou "Regex". Il existe un outil très pratique pour tester celles-ci, il s'agit de Rubular. Vous pouvez apprendre à composer vous-même votre Regex ici, et comme ce n'est pas l'objet de ce billet, je vous invite à y jeter un oeil.

validates :livre_prefere, 
:format => { :with => /\A[a-zA-Z]+\z/ }

où /\A[a-zA-Z]+\z/ est votre Regex. Vous pouvez d'ailleurs vous pré-fabriquer des Regex et les mettre dans une variable afin de les retrouver et les ré-utiliser plus facilement:

regex_noms= /\A[a-zA-Z]+\z/
validates :livre_prefere, :format => { :with => regex_noms }
Une autre vérification également très utile est la validation du nombre de caractère: y en a-t-il assez ? y a-t-il trop ? Vous pouvez définir un nombre de lettres minimum et/ou un nombre de lettre maximum, ainsi qu'un nombre de lettre exact. :)
# Nombre de lettres mini: 2
validates :livre_prefere, :length => { :minimum => 2 }

# Nombre de lettres max: 12
validates :livre_prefere, :length => { :maximum => 12 }

# Nombre de lettres doit être compris entre 6 et 20
validates :livre_prefere, :length => { :in => 6..20 }

# Nombre de lettre doit être égal à 6
 { :is => 6 }       

En plus de cela, pensez à utiliser l'attribut html "maxlength" pour indiquer à l'utilisateur que le nombre de caractères est limité: croyez-moi, il vous en sera reconnaissant de l'avoir indiqué avant la validation du formulaire !

Enfin, une autre validation, mais pas des moindres, est la vérification de la valeur "unique" de la donnée. Elle s'effectue notamment sur les identifiants (pseudonyme et/ou email), pour éviter des confusions d'identité ainsi qu'un excès de multi-comptes.

validates :livre_prefere, :uniqueness => { :case_sensitive => false }

Voilà, nous en avons fini pour les validations les plus courantes ! Si vous n'avez pas trouvé votre bonheur, vous pouvez jeter un oeil sur quelques autres validations ici, dans la partie 3 "Validation Helpers". Le guide est en anglais, mais il est très facile à comprendre. :)

Pour conclure, j'ai le plaisir de vous annoncer que ce chapitre "Passer du site statique au site dynamique" est enfin terminé ! Nous sommes certes encore loin de tout vous avoir appris sur Rails, mais vous devriez avoir quelques bases pour commencer à créer vous-même votre site dynamique. :)
Dorénavant, sachez que les billets n'auront plus vraiment "d'ordre chronologique", et je vous invite à utiliser les "libellés" (ou tags) dans le menu sur votre droite pour rechercher les sujets plus ou moins liés.
En espérant que ce chapitre vous aura été utile, je vous dis à bientôt pour d'autres billets, plus axés "trucs et astuces" et résolutions de problèmes rencontrés en tous genres ! :p

Aucun commentaire: