2012-05-30 15 views
20

Çok karmaşık bir doğrulamayı kodlamanız gerekiyorsa, hata bazen belirli bir öznitelikte değil, bunların birçoğunda birlikte bulunmaz.ActiveRecord nesnesine belirli bir öznitelikle ilişkilendirmeden hata eklemek mümkün mü?

Örneğin, şu zaman aralığı arasında doğrulamak istiyorsanız: start_date ve: end_date, herhangi bir pazar içermiyorsa, hata özellikle bu alanlardan birine ait değildir, ancak Hatalar ekleme yöntemini belirtmesi gerekir.

cevap

29

deneyin yapıyor şey:

# Your Model.rb 
validate :my_own_validation_method 

... 

private 

def my_own_validation_method 
    if there_is_no_sunday_in_the_range 
     self.errors[:base] << "You must have a Sunday in the time range!" 
    end 
end 

Temel olarak, bir model için kendi karmaşık doğrulama ekleyerek ve hatalı bir durumun ortaya çıktığını görünce, sen dizisindeki bir hata dizesi ekleyebilir hatalar.

instance.errors[:case_of_the_sundays] << "Error, son." 

Sadece biraz daha açıklayıcı:

+1

Mükemmel, bu sadece ihtiyacım olan şey. Dokümanlar –

+2

içinde bulamadı. Ne: temel hataları karma? – holaSenor

+4

Normalde belirli bir özelliğe bir hata ekleyebilirsiniz. Örneğin, "yaş" özelliğine sahip bir "Kullanıcı" modeliniz varsa, bu özellik için bir hata eklemek isteyebilirsiniz, böylece "self.errors [: age] <<" yazabilirsiniz. "Hata" gibi bir hata yapacak "Yaş 0'dan az olamaz". Ancak, hata herhangi bir belirli özellikle ilgili değilse, onu tabanına, yani modelin kendisine ekleyebilirsiniz. Yani 'self.errors [: base] <<" Her şey yanlış! "' Hata mesajı "Her şey yanlış" yapar; herhangi bir belirli özelliğe bağlı değil. – MrDanA

5

rails guide link - Bir özniteliğe özel olarak bağlı olmayan genel hatalar eklemek için errors[:base] kullanabilirsiniz. Böyle

7
model_instance.errors[:base] << "msg" 
1

Aslında dilediğiniz karma anahtarı adlandırabilirsiniz.

0

Yukarıdaki yanıtlar güncel değil. Raylar 5 ve üstü için ilk parametre olarak :base ile ActiveModel::Errors add yöntemini çağırmanız gerekir. Aşağıdaki örneğe bakınız.

model_instance.errors.add(
    :base, 
    :name_or_email_blank, 
    message: "either name or email must be present" 
) 
İlgili konular