2010-12-11 26 views
52

Quelle est la manière d'installer un validateur min max dans Rails 3?Comment implémenter le validateur min/max dans Rails 3?

J'ai un modèle, avec les attributs min_age et max_age.

L'âge peut être dans la gamme de 0..100, mais je veux aussi de valider les valeurs de passage, je veux dire que Max est greather ou égale à min

{:min_age => 0, :max_age => 0} => true 
{:min_age => 0, :max_age => 1} => true 
{:min_age => 1, :max_age => 0} => false # max < min 
{:min_age => 1, :max_age => 101} => false # out of 0..100 range 

Répondre

97

Vérifiez la ActiveModel :: Validations :: NumericalityValidator: RailsAPI NumericalityValidator

spécifications:

it { 
    subject.max_age = 10 
    subject.min_age = 20 
    subject.should be_invalid 
    subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}") 
} 

Code:

validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age } 

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

Je ne sais pas si vous voulez valider la présence ou non, mais vous ajouteriez simplement cela comme une autre clé à vos validations, par ex.

validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true 
+0

ok, merci pour cet exemple !! – Robert

+0

Note - cela a bien fonctionné sur "créer" mais sur "mise à jour" j'ai eu une erreur "pile niveau trop profond" - en utilisant des entrées valides - qui était une bête à trouver. Aucun indice que ce validateur était la cause puisque l'erreur ne fait pas référence à la ligne de code avant la boucle. – JosephK

27

Vous pouvez également utiliser inclusion...in, comme dans:

validates :height, :inclusion => { :in => 1..3000, :message => "The height must be between 1 and 3000" } 
9
validates_numericality_of :min_age, greater_than: 0 
validates_numericality_of :max_age, less_than_or_equal_to: 100 
validates_numericality_of :max_age, greater_than: :min_age 

Vous pouvez également utiliser l'âge, comme ceci:

validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0 
+0

min_age 30, max_age 10, obtiendra toujours creux, mais il ne devrait pas - ma troisième ligne de code dans la question. – astropanic

+0

Je vous ai suggéré d'utiliser une entrée d'âge unique plutôt que min et max. Une façon de résoudre est d'imposer un max_age plus grand que min_age. Voir ma modification. Je n'ai pas testé le code. Dans tous les cas, vous devez avoir du code pour vous assurer que l'âge minimal n'est pas supérieur à l'âge maximum. – EastsideDeveloper

+0

Je ne peux pas utiliser un seul attribut, car ce n'est pas un âge mais une tranche d'âge. Je sais que j'ai besoin d'un code pour assurer le croisement de valeur, c'était ma question. – astropanic