2016-05-10 12 views
1

Nachdem ich (fast) alles Internet gelesen habe, brauche ich Sie in dieses Problem eingeben.Benutzerdefinierte Validierungen für nicht persistente Modell in Rails 4

Kontext: Ich habe ein non persisted Rails 4 modelActiveModel::Model mit, dass nach seiner Dokumentation, ActiveModel::Validations

-Code enthält:

class GoodnessValidator < ActiveModel::Validator 
    def validate(record) 
    if record.first_name == "Evil" 
     record.errors[:base] << "This person is evil" 
    end 
    end 
end 

class Person 
    include ActiveModel::Model 
    include ActiveModel::Validations 

    validates_with GoodnessValidator 
    attr_accessor :first_name 
end 

Problem: Als ich werde erstellen neue Person als p = Person.new(first_name: 'Evil') sollte validieren, die eine "böse Person" ist. Also erwarte ich einen Fehler Accessor wie p.errors, der mir eine Hash mit allen Fehlern zurückgeben sollte.

Aber immer ist leer, p.errors gibt nichts zurück. Noch nie.

[102] pry(main)> p = Person.new(first_name: 'Evil') 
=> #<Person:0x007fa0925809f0 @first_name="Evil"> 
[103] pry(main)> p.errors 
=> #<ActiveModel::Errors:0x007fa09173ac88 @base=#<Person:0x007fa0925809f0 @errors=#<ActiveModel::Errors:0x007fa09173ac88 ...>, @first_name="Evil">, @messages={}> 
[104] pry(main)> p.errors.full_messages 
=> [] 
[105] pry(main)> 

Antwort

2

Die Validierungen werden normalerweise beim Speichern des Modells ausgelöst. In Ihrem Fall müssen Sie sie manuell ausführen, dann überprüfen Sie die Fehler:

p = Person.new(first_name: 'Evil') 
unless p.valid? # runs the validations 
    puts inspect p.errors 
end 
+0

Und umgekehrt gibt es auch eine 'ungültige?' Methode, die Validierung auch auslöst. –

+0

Ohhh, guter Punkt! Sie haben Recht, Validator ist eine Klasse, die zuvor instanziiert und gültig sein muss? do it – skozz

+0

Sunil: ungültig? funktioniert natürlich auch: D – skozz