2014-07-08 28 views
15

Çoğu uygulamada olduğu gibi, tüm nesnelerin ısrar edilmeden önce uyması gereken bir dizi sert ve hızlı doğrulama kurallarına sahip bir Rails projem var. Doğal olarak, ActiveModel'in Validasyonları bunun için mükemmeldir - Rails varsayılanlarının ve kendi elden haddelenmiş valizlerimizin bir kombinasyonunu kullanıyoruz.Kayıt doğrulama uyarılarının yanı sıra hataların raporlanması için etkili bir yol?

Her ne kadar olsa da, verileri, en katı anlamıyla geçersiz olmasa da, gözden geçirmesi gereken unsurlar olduğu durumlarda, kullanıcıyı uyarmak istediğimiz kullanım durumlarına karşı geliyoruz; Kendileri, kayıt sürekliliğinin oluşmasını engellememelidir. Kafamın üst kapalı birkaç örnek: Bir yazı başlığı TÜM HARFLERDEN sunulmuştur

  • , muhtemelen geçerli olabilir ama gövde metni bir pice x sayısından fazladır
  • değil zaten mevcut ve bu kadar çok matchers var - - ideal ben yeniden muktedir istediğinizi kelimelerin daha az ya da daha çok önerilen bir kelime yerine doğrulamaları modülü biz doğrulama hataları nasıl ele için böyle iyi bir benzetmedir

saymak Bu temel kod, ancak errors ile birlikte warnings ürün koleksiyonu oluşturmak için. Bu, evdeki olası ihlallerin daha kötü ve sıkı bir şekilde uygulanan kurallara eşdeğer olduğunu ima etmektense, bu durumları kullanıcılarımıza farklı şekilde vurgulamamıza izin verecektir.

activemodel-warnings gibi mücevherlere baktım, ancak kayıt doğrulandığında, eşleştiricilerin kontrol edildiğini değiştirerek, errors koleksiyonunu buna göre genişleterek veya daraltarak çalışırlar. Benzer şekilde, bir şeyleri el ile yapıp yapamayacağımı görmek için doğrulamalar için yerleşik :on parametresine baktım, ancak yine de tüm ihlaller ayrıştırmak yerine bir hata topluluğuna dönüşecek.

Herkes benzer bir şey denedi mi? Bu hedefe ulaşmak isteyen tek kişi olduğumu hayal bile edemiyorum ama şu anda boş bir çizim yapıyorum ...

+2

Bu sorunun kabul edilen cevabını incelediniz mi? http://stackoverflow.com/questions/3342449/activerecord-replace-model-validation-error-with-warning Ayrı bir 'ActiveModel :: Hatalar 'oluşturabilir ve uyarılarınız için depolama alanı olarak kullanabilirsiniz – Benj

+0

ilginç, Benjamin, teşekkürler. Bu yaklaşım, içselleri aynı olsa bile, hata üretenlere karşı uyarılar için ayrı ayrı eşleştiriciler yazmamız gerektiği anlamına gelir. Kod çoğaltma potansiyeli olmasına rağmen bununla yaşayabilirim. Rails'in yerleşik Uzunluk doğrulama eşleştiricisini, arama bağlamına dayalı hatalar yerine uyarılar çıkarabilmesi için bir yolun yeniden tanımlanması için bir araç ... Ama eğer ihtiyacım olan yere götürürse pragmatik olmaya hazırım olun! –

+0

Ben bu konuya derin girmedim, ama evet, o onaylama sınıflarının tümünü çoğaltmanız gerekecek gibi görünüyor. Eğer 'record.warnings.add (niteliğini, ...) gerekecektir nerede (... niteliğini)' 'Ayrıca – Benj

cevap

15

İşte Rails 3 projesi için yazdığım bazı kodlar tam olarak Burada bahsediyorsun.

# Define a "warnings" validation bucket on ActiveRecord objects. 
# 
# @example 
# 
# class MyObject < ActiveRecord::Base 
#  warning do |vehicle_asset| 
#  unless vehicle_asset.description == 'bob' 
#   vehicle_asset.warnings.add(:description, "should be 'bob'") 
#  end 
#  end 
# end 
# 
# THEN: 
# 
# my_object = MyObject.new 
# my_object.description = 'Fred' 
# my_object.sensible? # => false 
# my_object.warnings.full_messages # => ["Description should be 'bob'"] 
module Warnings 
    module Validations 
    extend ActiveSupport::Concern 
    include ActiveSupport::Callbacks 

    included do 
     define_callbacks :warning 
    end 

    module ClassMethods 
     def warning(*args, &block) 
     options = args.extract_options! 
     if options.key?(:on) 
      options = options.dup 
      options[:if] = Array.wrap(options[:if]) 
      options[:if] << "validation_context == :#{options[:on]}" 
     end 
     args << options 
     set_callback(:warning, *args, &block) 
     end 
    end 

    # Similar to ActiveModel::Validations#valid? but for warnings 
    def sensible? 
     warnings.clear 
     run_callbacks :warning 
     warnings.empty? 
    end 

    # Similar to ActiveModel::Validations#errors but returns a warnings collection 
    def warnings 
     @warnings ||= ActiveModel::Errors.new(self) 
    end 

    end 
end 

ActiveRecord::Base.send(:include, Warnings::Validations) 

nasıl kullanılacağını üst gösterisinde yorumlar. Bu kodu bir başlatıcıya koyabilirsiniz ve daha sonra tüm ActiveRecord nesneleriniz için uyarılar mevcut olmalıdır. Ve daha sonra, her modelin en üstünde, uyarılara sahip olabilen ve istediğiniz kadar çok uyarıyı manuel olarak ekleyebileceğiniz bir warnings do blok ekleyin. Bu blok, modele .sensible? numaralı telefonu arayana kadar çalıştırılmaz. Ayrıca, uyarılar doğrulama hataları olmadığından, "mantıklı" olmasa bile, bir modelin teknik olarak geçerli olmaya devam edeceğini de unutmayın (sözünü ettiğim gibi).

+0

Teşekkürler! Tam olarak aradığım şey! Rails 4 ile de harika çalışıyor. Rails hata doğrulamaları ile birlikte kullandım. – hade

İlgili konular