2012-05-28 21 views
5

Seri hale getirilmiş özniteliği (dizisi) olan bir modelim var. Modeli doğrulamak istiyorum, sadece dizinin her üyesi önceden belirlenmiş seçenekler dahilinde bulunuyorsa.Seri hale getirilmiş bir öznitelikte eklenme doğrulaması nasıl gerçekleştirilir?

Örnek: Bir "mod" özniteliğine sahip bir Kişi modelim var. Kullanıcıların birden fazla ruh hali olabilir, ancak her bir ruh hali 'mutlu', 'üzgün', 'yorgun' veya 'öfkeli' olmalıdır.

class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    # validates :inclusion => { :in => MOODS } 

    attr_accessible :mood 
    serialize :mood 
end 

yorumladı doğrulama çalışmaz:

modeli böyle bir şey olurdu. Çalıştırmak için herhangi bir yolu var mı yoksa özel bir doğrulama mı gerekiyor?

(. Not: Ben ayrı Mood model oluşturmak istemiyorum)

cevap

8
class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    validate :mood_check 
    attr_accessible :mood 
    serialize :mood 

protected 
    def mood_check 
    mood.each do |m| 
     errors.add(:mood, "#{m} is no a valid mood") unless MOODS.include? m 
    end 
    end 

end 
+0

kontrol edin bu dokümantasyon, http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion: Sadece için, bir blok sözdiziminde beklediğinizden yollarını bu doğrulamaları koyabilirsiniz. Bunun için özel geçerlilikler oluşturmanız gerekmez. Serileştirilmiş öznitelikler üzerinde – Chamnap

+0

, aksi takdirde, seri hale getirilmiş değer eklenmesi için kontrol edilir, yani mood = [yorgun, kızgın] MOODS.include? (Mood) yanlış olduğundan başarısız olur. –

+0

Ah, serileştirme yöntemini görmedim. Cevabın doğru olmalı o zaman. – Chamnap

2

diye burada bu bırakmak gelecekte herkes yardımcı olur - Daha iyi tefrika doğrulayarak işlemek için bir mücevher yazdım Öznitellikler.

class Person < ActiveRecord::Base 
    MOODS = %w[happy sad tired angry] 
    attr_accessible :mood 
    serialize :mood 

    validates_array_values :mood, inclusion: { in: MOODS } 
end 

https://github.com/brycesenz/validates_serialized

İlgili konular