Validation Conditionnelle

édité Le 19/05/2010 à 18:43 par Trinoo

Validation Conditionnelle sous Ruby on Rails

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".

Voilà à quoi ressemble le modèle :
 class Comment < ActiveRecord::Base
  
  belongs_to :post
  belongs_to :user

  validates_presence_of :auteur, :auteururl, :body
  
 end
Pour le cas d'un membre inscrit avec une session ouverte, il est clair que les champs "auteur" et "auteururl" seront vide. Ces données seront récupérés sur la table "users" par l'intermédiaire de la clé étrangère. Donc, la validation va lever un drapeau rouge vu l'absence de ces deux.

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.

Commentaires

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.

Auteur*

Site Web (facultatif)

Contenu