Faciliter la validation des données

Faciliter la validation des données

Dans Ruby on Rails et la plupart des frameworks, les données sont exposées sous forme de modèles : on dispose de classes (User, Team, Article, etc.) qui permettent d'abstraire l'accès aux données en manipulant des objets : ce sont des ORM.

Ainsi, on peut écrire des choses comme ça :

user = User.find_by_email("endive@endive.com")
users = User.where('? < birthday', 18.years.ago)

Ici, la classe User est un modèle qui, en étendant une classe fournie par le framework, acquiert des méthodes bien utiles qui permettent de récupérer des lignes dans la table “users”.

En plus de ces méthodes de recherche, le framework fournit (entre autre) des méthodes de validation. Par exemple :

class User < ActiveRecord::Base
  # L'email devra respecter une certaine expression rationnelle et être unique.
  validates_format_of :email, :with => RFC822::EMAIL
  validates_uniqueness_of :email
 
  # Le nom devrait faire entre 3 et 20 caractères. Il devra également être unique.
  # On peut également écrire plusieurs validateur en une fois.
  validates :display_name, :length => 3..20, :uniqueness => true
 
 
  # Le mot de passe devra contenir au moins 6 caractères.
  # Il doit être confirmé (en donnant une valeur à l'attribut password_confirmation).
  validates :password, :length => { :minimum => 6 }, :confirmation => true
 
  # Si le sexe est donné (ce n'est pas obligé), il doit être dans la liste.
  validates_inclusion_of :gender, :in => [ 'male', 'female' ], :allow_nil => true
end

Ici, on s'assure qu'un objet User ne pourra jamais être insérée dans la base de données si ses attributs ne sont pas validés. Par exemple :

user = User.new(:display_name => "Li", :gender => 'endive')
 
unless user.save # A moins que la sauvegarde n'ai réussie…
  p user.errors # Affiche nous les erreurs qu'il y a eu.
end

Et dans cet objet qui contient les erreurs, on trouve la liste des messages !

{
  :display_name => [ "Le nom doit contenir au moins 3 caractères !" ],
  :email        => [ "L'email est invalide !" ],
  :gender       => [ "Ce genre n'est pas autorisé." ],
  :password     => [ "translation missing: fr.activerecord.errors.models.user.attributes.password.too_short" ]
}

Le nom est donc trop court, l'email n'est pas valide (forcément, il est vide !) et le sexe n'est pas dans la liste des valeurs autorisée. Quant au mot de passe… Il contient un curieux message d'erreur !

Comme on peut le voir, le framework gère l'internationalisation (souvent abrégé i18n) (une force de plus du framework qui fera l'objet d'un autre point). On peut voir qu'il manque la traduction française dans le cas où le mot de passe d'un utilisateur est trop court, mais le framework nous indique précisément quelle clé traduire.

Grâce à ces mécanismes, on peut s'assurer qu'on ne met pas n'importe quoi dans sa base de données. On peut également donner des informations précises à l'utilisateur quand il saisit des informations erronées, ce qui nous sera très utiles pour créer des formulaires efficaces.

 
pourquoi_utiliser_un_framework/validation_des_donnees.txt · Dernière modification: 2011/05/30 09:39 par Sephi-Chan