2010-06-28 7 views
4

Est-il possible de faire exécuter les validations de mon modèle de rails dans un ordre particulier et d'ignorer certaines validations si les validations précédentes ne sont pas satisfaites?validation de validation de modèle de rails et commande

Par exemple: J'ai 2 champs d'entrée start_date et end_date. J'ai deux méthodes validate dans mon modèle

L'un d'eux vérifie les dates sont moins "12/31/# {Date.today.year + 1}"

def end_date_in_range 
    if self.end_date 
     errors.add_to_base("Enter a date before #{Date.today.year + 1}") if self.end_date > Date.parse("12/31/#{Date.today.year + 1}") 
    end 
end 

J'ai une autre validation qui étapes à travers les dates de la date de début à la date de fin

def 
    (self.start_date.to_date .. self.end_date.to_date).inject(0) { |sum, n| ... } 
    end 

maintenant, si l'utilisateur entre un date_fin comme 12/31/20101, cela échoue la première validation, mais ressemble non plus continue de vérifier la prochaine validation ou la deuxième validation est exécuté en premier et dans les deux cas, il bloque mon application pendant le processus cette demande. Je voudrais qu'il vérifie la première validation et renvoie l'erreur à l'utilisateur et ne franchisse pas les dates dans la deuxième validation.

grâce, cendres

Répondre

1

utilisation elsif

def end_date_in_range 
    if self.end_date 
     errors.add_to_base("Enter a date before #{Date.today.year + 1}") if self.end_date > Date.parse("12/31/#{Date.today.year + 1}") 
    elsif #second validation test 

    end 
end 
0

probablement pas nécessaire dans ce cas (la réponse de Salil fonctionne mieux pour ce cas simple), mais si vous avez plusieurs validations qui sont subordonnées à un seul ensemble de conditions, vous pouvez également ajouter une clause "if" à une validation, par exemple:

validates :first_validation 
validates :second_validation, :if => :check_conds_now 
validates :third_validation, :if => :check_conds_now 

# should return true/false 
def check_conds_now 
    (cond1 && cond2 && ! cond3) 
end