2012-07-30 8 views
5

Zusammenfassung: Ich versuche, der Wert eines Attributs innerhalb eine benutzerdefinierte ActiveModel::EachValidator Validator zu verändern. Angesichts der folgenden Prototyp:ändern oder einen Attributwert aktualisieren während Rails Active Validierung

def validate_each(record, attribute, value)

versucht value = thing einzustellen scheint nichts weiter zu tun - bin ich etwas fehlt? Es sollte eine kluge Möglichkeit sein, dies zu tun ...

Detail: Ich akzeptiere eine URL-Eingabe als Teil einer Website. Ich möchte nicht einfach die URL nehmen und direkt validieren, dass es eine 200 OK Nachricht zurückgibt, weil das Einträge ignorieren würde, die nicht mit http starteten, oder die führenden www usw. ausgelassen haben. Ich habe einige benutzerdefinierte Logik, um damit umzugehen diese Fehler und folgen Umleitungen. Daher möchte ich die Validierung zu erfolgreich, wenn ein Benutzer example.org/article statt http://www.example.org/article eingeben. Die Logik funktioniert ordnungsgemäß innerhalb der Validierung, aber das Problem ist, dass, wenn jemand die erstere eingibt, der gespeicherte Wert in der Datenbank in der "falschen" Form und nicht in der schön aktualisierten Form ist. Kann ich den Eintrag während der Validierung in eine kanonische Form ändern?

+0

+1 für eine gute Frage – neeraj

Antwort

11

Sie sollten die Validierung verlassen, um genau das zu tun: validieren; Es ist nicht der richtige Ort, um die Attribute Ihres Modells zu manipulieren.

Siehe ActiveModels before_validation Rückruf. Dies ist ein geeigneterer Ort, um Modellattribute in Vorbereitung auf die Validierung zu manipulieren.

Offenbar müssen Sie Ihre ActiveModel-Implementierung über Callbacks informieren, zumindest nach this SO question.

class YourModel 
    extend ActiveModel::Callbacks 
    include ActiveModel::Validations 
    include ActiveModel::Validations::Callbacks 

    before_validation :manipulate_attributes 

    def manipulate_attributes 
    # Your manipulation here. 
    end 
end 
+0

Guten Ruf zu fragen - nicht versuchen, die Dinge bei der Validierung zu ändern. Hinzufügen von Code in before_validation hilft, danke! – aardvarkk

+0

+1 für eine gute Lösung, da ich nach dem gleichen suchte. – neeraj