9

Ich möchte beim Speichern/Aktualisieren eines Modells in Schienen einen Feldfehler durch eine Warnung ersetzen können. Grundsätzlich mag ich nur einen Wrapper um die Validierungsmethoden schreiben, die die Fehler erzeugen werden, das Modell speichern und vielleicht in einer Warnung Hash verfügbar sein (was ebenso wie die Fehler Hash funktioniert):ActiveRecord - Modellvalidierungsfehler durch Warnung ersetzen

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 

Jede Idee, wie Ich könnte das umsetzen? Ich konnte :warning => false Default-Wert zu ActiveRecord::Validations::ClassMethods::DEFAULT_VALIDATION_OPTIONS hinzufügen. Durch die Erweiterung des Moduls, aber ich bin auf der Suche nach einem Einblick, wie Sie den Rest implementieren. Vielen Dank.

Antwort

4

Ich weiß nicht, ob es für Rails 3 bereit ist, aber dieses Plugin tut, was Sie suchen:

http://softvalidations.rubyforge.org/

Edited hinzufügen:

die grundlegende Funktionalität dieses aktualisieren mit ActiveModel kam ich mit dem Follow-up:

#/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 

Es fügt eine neue Fehler l ike Objekt namens Warnungen und eine Hilfsmethode abgeschlossen?, und Sie können es zu einem Modell hinzufügen wie folgt:

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

The validation_scopes gem verwendet einige schöne metaprogramming Magie Sie alle üblichen Funktionalität von Validierungen und Active :: Fehler in anderen Zusammenhängen als object.errors Objekte zu geben .

Zum Beispiel können Sie sagen:

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

Die obige Validierung wird wie gewohnt auf object.valid ausgelöst werden ?, sondern spart nicht auf object.save in die Datenbank sperren, wenn some_attr nicht vorhanden ist . Alle zugeordneten ActiveRecord :: Errors-Objekte werden in object.warnings gefunden.

Validierungen, die in der üblichen Weise ohne einen Bereich angegeben werden, verhalten sich immer noch wie erwartet, blockieren Datenbanksicherungen und weisen object.errors Fehlerobjekte zu.

Der Autor hat eine kurze Beschreibung der Entwicklung des Edelsteins on his blog.

+0

sehr cool, danke! – sa125

+0

Die Gem-Version 0.5.1 ist kompatibel mit Rails 3, aber eine einfache Änderung an der Gemspec (siehe https://github.com/ivalkeen/validation_scopes/commit/acc1545a028605997e87fd41efece0ddffd3b999) ermöglicht die Verwendung in Schienen 4. – KenB

1

ich mein eigenes Schmuckstück gemacht, das Problem für Rails 4.1 und höher zu lösen: 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