2012-09-09 12 views
6

Sadece geçerli alan veritabanında boş değilse, bir alanın boş/boş bırakılmasına izin vermeyecek özel bir doğrulama işlevi oluşturmak istiyorum. Doğrulama işlevindeki veritabanı değerine (eski değer) nasıl erişebilirim? Self.name_of_field kullanarak yeni değere erişebilirim. Raylar: Düzenleme sırasında doğrulama için eski değeri ve yeni değeri karşılaştırın

Bu

ben

validate :image_remote_url_change 
    def image_remote_url_change 
    if self.image_remote_url.blank? and self.image_remote_url_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
    end 

Şu anda varolan nesneyi düzenlemek çalışırsanız şu anda ne var, o boş bir yeni değeri kabul olmaz ama yeni bir nesne oluşturduğunuz zaman "olabilir diyecek eski değere asla ayarlanmasa bile, bir kez ayarlanamaz.

cevap

7

ActiveModel::Dirty'den yararlanabilirsiniz. Özel doğrulama işlevinizde alanın boş olup olmadığını ve değişip değişmediğini kontrol edebilirsiniz:

validate :custom_validation_function 

def custom_validation_function 
    if self.field.blank? and self.field_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
end 
+2

+1. Heroku'dan Schneems'in bir önceki makalesinde (http://schneems.com/post/28425724540/get-previously-saved-changes-in-rails), bir önceki_kullanım yöntemini tartışıyor ve bu da size yardımcı olabiliyor: – stephenmurdoch

+0

Doesn ' t Bu sadece nesne değişmiş olsa da işe yarıyor mu? içinde olduğu gibi başarıyla kaydedildi. Ben sadece bunu bir doğrulama adımında yapıyorum –

+0

@ glumbo deneyin ve – stephenmurdoch

İlgili konular