2012-03-17 16 views
7

Rails (3.2.0) üzerinde Ruby (1.9.3) çalıştırıyorum ve sanal özniteliklerin doğrulanmasıyla ilgili bir sorun yaşıyorum.Ruby on Rails'deki sanal özniteliklerin doğrulanması

Diğerlerinin yanı sıra, kalkış ve varış havalimanını temsil eden özelliklere sahip bir uçuşu temsil eden bir Flight modelim var.

Bir havalimanı seçmek için select potansiyel olarak çok büyük olduğundan, mükemmel bir şekilde çalışmakta olan otomatik tamamlama çözümüne gitmeyi tercih ettim.

before_validation do 
    self.departure_airport = Airport.find_by_long_name(departure_airport_name) 
    self.arrival_airport = Airport.find_by_long_name(arrival_airport_name) 
end 

Sorun, ancak kullanıcı veritabanında mevcut olmayan bir havaalanının adını girdiğinde, taahhüt olduğunu başarısız: Ben düzgün havaalanının gerçek kimliğini doldurmak için bir before_validation geri arama kullanıyorum Her iki havalimanının kimliği nil'dur. Harika. Ne var değil harika, ancak, teknik olarak, başka bir alan için giriş çünkü bu doğrulama hatası formda yansıyan olmamasıdır:

validates :departure_airport, :arrival_airport presence: true 

attr_accessor :departure_airport_name, :arrival_airport_name 

<%= f.input :departure_airport_name %> 
<%= f.input :arrival_airport_name %> 

düzgün yaklaşık gitmek için bu bile böyle mi havaalanının adını dönüştürülmesi, before_validation geri aramada bir kimliğe mi? Ve eğer öyleyse, doğrulama hatalarını havalimanının sanal ad niteliğinde görünmesini nasıl sağlayabilirim?

cevap

4

before_validation geri bildirimi ile doğru yola gidiyorsunuz.

Her normal özellik gibi sanal öznitelikleri doğrulayabilirsiniz. Yani tek ihtiyacınız olan sadece modelde bir doğrulama. Bu deneyin:

validates :departure_airport, presence: true 
validates :arrival_airport, presence: true 

bu hızlı tepki için ... formunuzda

+0

Teşekkür nesneleri hatalara bir hata eklemek gerekir ve hata görüntülenmesi gereken! "Departure_airport" ve "arrival_airport" adreslerinde zaten doğrulamalarım var. Sorun şu ki, bunlar formdaki 'girdinin' temsil ettiği alanlar değil. Varlığı doğrulayamıyorum çünkü birileri bunlara metin yazdığında, alan mevcut, ancak gerçek "Havalimanı" nesnesi eksik olacak. – Laurens

+0

Bu yüzden 'before_validation' geri aramayı kaydettirirsiniz. Kullanıcı anlamsızca girdiğinde, havaalanını bulamaz ve doğrulama başarısız olur. Bir hata eklenir ve kullanıcıya gösterilecektir. Belki özel bir hata masajı eklemeyi düşünmelisin. – klump

+0

Üzgünüm, benim hatam. Anlamadım. Belki de kendi doğrulama metoduna ihtiyacın var. Nesneye 'self.errors.add (: fieldname," message ")' ile hata ekleyebilirsiniz. Şimdi 'departure_airport_name' alanını alan adı olarak kullanıyor ve bir mesaj ekliyorsanız, 'departure_airport_name' alanında görüntülenecektir. – klump