9

Desidero essere in grado di sostituire un errore di campo con un avviso quando si salva/aggiorna un modello in rotaie. Fondamentalmente io voglio scrivere solo un wrapper per i metodi di validazione che ti generano l'errore, salvare il modello e, forse, essere disponibile in un hash avvertenze (che funziona proprio come l'errori di hash):ActiveRecord - sostituire l'errore di convalida del modello con avviso

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 

Qualsiasi idea di come Potrei implementarlo? Sono stato in grado di aggiungere il valore predefinito :warning => false a ActiveRecord::Validations::ClassMethods::DEFAULT_VALIDATION_OPTIONS Estendendo il modulo, ma sto cercando alcune informazioni su come implementare il resto. Grazie.

risposta

4

Non so se è pronto per Rails 3, ma questo plugin fa quello che stai cercando:

http://softvalidations.rubyforge.org/

A cura di aggiungere:

Per aggiornare le funzionalità di base di questa con ActiveModel sono venuto con la seguente:

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

Si aggiunge una nuova errori l oggetto ike chiamato avvisi e un metodo di supporto completo?, ed è possibile aggiungere a un modello in questo modo:

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

Il validation_scopes gem usa qualche bella magia metaprogrammazione per darvi tutte le solite funzionalità di convalide e ActiveRecord :: errori oggetti in contesti diversi da object.errors .

Ad esempio, si può dire:

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

La convalida di cui sopra saranno attivati ​​come di consueto sul object.valid ?, ma non bloccherà salva al database sul object.save se some_attr non è presente . Qualsiasi oggetto ActiveRecord :: Errors associato verrà trovato in object.warnings.

Le convalide specificate nel solito modo senza un ambito si comportano comunque come previsto, bloccando il salvataggio del database e assegnando oggetti errore a object.errors.

L'autore ha una breve descrizione dello sviluppo della gemma on his blog.

+0

molto cool, grazie! – sa125

+0

La gem versione 0.5.1 è compatibile con rails 3, ma una semplice modifica alla gemspec (vedere https://github.com/ivalkeen/validation_scopes/commit/acc1545a028605997e87fd41efece0ddffd3b999) consente di utilizzarla nei binari 4. – KenB

1

ho fatto il mio gioiello per risolvere il problema per Rails 4.1+: 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