2010-12-11 12 views
52

Raylar 3'te bir min maks validatorun uygulanmasının ray yolu nedir?Rails 3'te min/maks validator nasıl uygulanır?

Min_age ve max_age özniteliklerine sahip bir modelim var.

Yaş 0..100 aralığında olabilir, ama ben max ActiveModel

{: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 

cevap

97

kontrol dışarı min daha greather veya eşit olduğu anlamına, geçiş değerlerini doğrulamak da istiyoruz :: Validations :: NumericalityValidator: RailsAPI NumericalityValidator

spec:

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}") 
} 

kodu:

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

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

Varlığı doğrulamak isteyip istemediğinizi bilmiyorum, ancak bunu doğrulamalarınız için başka bir anahtar olarak eklemelisiniz, örn.

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

sayesinde bu örnek için !! – Robert

+0

Not - bu "oluşturma" üzerinde ama "güncelleme" üzerinde gayet iyi çalıştı - geçerli girdi kullanarak bir "yığın seviyesi çok derin" hatası - bulmak için bir canavar oldu. Hatasız, kodun döngüden önce kod satırına herhangi bir ref yapılmadığından, bu doğrulama aracının nedeni yok. – JosephK

27

Ayrıca olduğu gibi inclusion...in kullanabilirsiniz: Ayrıca bu gibi yaş kullanabilirsiniz

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 

:

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

min_age 30, max_age 10, hala yalak alacaktır, ancak bu olmamalıdır - sorudaki üçüncü kod satırım. – astropanic

+0

Min ve max yerine tek bir yaş girişi kullanmanızı önerdim. Çözmenin bir yolu, min_age'den daha büyük bir max_age'ye sahip olmaktır. Düzenlememe bak. Kodu test etmedim. Her durumda, küçük yaşın maksimum yaştan büyük olmamasını sağlamak için bazı kodlara sahip olmanız gerekir. – EastsideDeveloper

+0

Tek bir özellik kullanamıyorum çünkü yaş değil, bir yaş aralığı. Değer geçişini sağlamak için bazı kodlara ihtiyacım olduğunu biliyorum, bu benim sorumydu. – astropanic