Validation Conditionnelle
édité Le 19/05/2010 à 18:43 par Trinoo
Dernièrement, j'étais confronté à une problèmatique de validation de données d'un formulaire (les commentaires).
L'aspect du formulaire change en fonction du posteur. Si ce dernier est inscrit et qu'il a déjà ouvert une session, il n'y à qu'un champs à remplir dans le formulaire (celui du commentaire), sinon pour un invité il y'en à 3 : "auteur", "site web" et ,"commentaire".
class Comment < ActiveRecord::Base belongs_to :post belongs_to :user validates_presence_of :auteur, :auteururl, :body end
On pourrait placer quelques lignes de code dans le contrôleur qui teste l'ouverture ou pas de la session. Et en fonction, placer des valeurs spéciales dans ces champs pour que le modèle puisse valider leur existance. Mais s'il faut procéder ainsi à chaque fois qu'on aura à traiter ces champs, on se trouve à coté de la philosophie de Ruby et de Rails
Voyons ce que l'on peut faire au niveau du modèle sans trop charger le contrôleur :
On rajoute une variable d'état (logged) à l'instance "comment" dans l'action(ou méthode) create
def create ... @comment.logged = true if logged_in? ... end
"logged_in?" est un helpers qui nous indique si il y a une session ouvert en cours ou pas (restful authentication).
On rajoute par la suite un attr_accessor dans le modèle pour lire son état défini dans le contrôleur.
Voilà ce que ça donne
class Comment < ActiveRecord::Base attr_accessor :logged belongs_to :post belongs_to :user validates_presence_of :auteur, :if => :invite? ... def invite? !logged end ...
Voyons un autre cas de validation conditionnelle qui peut vous simplifier la vie dans un cas similaire
validates_presence_of :password, :on => :create
Ici, notre validation rentre en jeu uniquement à la création de notre enregistrement (et non dans le cas d'un 'update')
Je pense qu'avec un peu d'imagination, vous aller pouvoir alléger votre code source avec une séance de nettoyage.
Ajouter un Commentaire
Les champs marqués par une * sont obligatoires.
Votre adresse de messagerie ne sera pas publiée et ne sera pas utilisée à des fins publicitaires.



Commentaires