2010-07-27 26 views
9

numaralı uyarıyla değiştirin. Bir modeli hata durumunda kaydederken/güncellerken bir uyarı ile alan hatasını değiştirmek istiyorum. Temelde ben sadece hatayı elde edersiniz doğrulama yöntemlerinden etrafında sarıcı yazma modeli kaydetmek ve belki de (tıpkı hatalar karma gibi çalışır) bir uyarı karma satışa sunulacak istiyorum:ActiveRecord - model doğrulama hatasını

class Person < ActiveRecord::Base 
    # normal validation 
    validates_presence_of :name 

    # validation with warning 
    validates_numericality_of :age, 
          :only_integer => true, 
          :warning => true # <-- only warn 
end 

>>> p = Person.new(:name => 'john', :age => 2.2) 
>>> p.save 
=> true # <-- able to save to db 
>>> p.warnings.map { |field, message| "#{field} - #{message}" } 
["age - is not a number"] # <-- have access to warning content 

herhangi bir fikir nasıl Bunu uygulayabilir miyim? ActiveRecord::Validations::ClassMethods::DEFAULT_VALIDATION_OPTIONS için varsayılan değeri :warning => false ekleyebiliyordum modülü genişleterek, ancak geri kalanını uygulama konusunda biraz bilgi arıyorum. Teşekkürler.

cevap

4

Rails 3 hazır olup olmadığını bilmiyorum, ama bu eklenti aradığınızı yapar:

http://softvalidations.rubyforge.org/

Düzenlendi eklemek için:

bu temel işlevselliği güncellemek için

Bu yeni hatalar ekler
#/config/initializer/soft_validate.rb: 
module ActiveRecord 
    class Base 
    def warnings 
     @warnings ||= ActiveModel::Errors.new(self) 
    end 
    def complete? 
     warnings.clear 
     valid? 
     warnings.empty? 
    end 
    end 
end 

#/lib/soft_validate_validator.rb 
class SoftValidateValidator < ActiveModel::EachValidator 
    def validate(record) 
    record.warnings.add_on_blank(attributes, options) 
    end 
end 

l: ActiveModel ile aşağıdaki ile geldi ike nesne uyarıları denilen ve yardımcı bir yöntem komple? ve bunu gibi bir modele ekleyebilirsiniz:

class FollowupReport < ActiveRecord::Base 
    validates :suggestions, :soft_validate => true 
end 
4

validation_scopes gem size doğrulamaları olağan işlevlerin tümü vermek bazı güzel metaprogramming büyü kullanır ve ActiveRecord :: Hatalar object.errors dışındaki bağlamlarda nesneleri .

validation_scope :warnings do |s| 
    s.validates_presence_of :some_attr 
end 

yukarıdaki doğrulama object.valid üzerinde her zamanki gibi tetiklenecek ?, ancak some_attr yoksa blok object.save üzerinde veritabanına kaydeder olmaz:

Örneğin, diyebiliriz . Herhangi bir ilişkili ActiveRecord :: Hata nesneleri object.warnings içinde bulunur.

Kapsam dahilinde olağan şekilde belirtilen değerler, beklendiği gibi davranmaya devam eder, veritabanı engelleme ve hata nesneleri atamak için object.errors.

Yazar, gem'in geliştirme on his blog'un kısa bir açıklamasına sahiptir. https://github.com/s12chung/active_warnings

class BasicModel 
    include ActiveWarnings 

    attr_accessor :name 
    def initialize(name); @name = name; end 

    warnings do 
    validates :name, absence: true 
    end 
end 

model = BasicModel.new("some_name") 
model.safe? # .invalid? equivalent, but for warnings 
model.warnings # .errors equivalent 
+0

çok serin, teşekkür: – sa125

+0

Gem sürüm 0.5.1 raylar 3 uyumlu, ancak gemspec basit bir değişiklik (bkz https://github.com/ivalkeen/validation_scopes/commit/acc1545a028605997e87fd41efece0ddffd3b999) raylar 4 içinde kullanılmasına izin verir. – KenB

1

Ben 4.1+ Raylar için sorunu çözmek için kendi mücevher yaptı!