2013-08-09 4 views
38

Ich habe eine Validierung zu einem Objekt mit:Was ist der Unterschied zwischen "validate" und "validates"?

validate :field, presence: true 

Ich fand sie geben keine Fehlermeldungen. Ich änderte sie zu validates und erhielt die Fehlermeldungen. This ticket ist relevant.

Ich habe versucht, eine benutzerdefinierte Validierung mit validates und bekam eine Fehlermeldung hinzuzufügen:

You need to supply at least one validation 

ich es validate geändert, und alles lief zusammen, wie erwartet.

Mein Verständnis ist es, validates mit normalen Validierungen und validate mit benutzerdefinierten zu verwenden. Ist das richtig? Gibt es noch andere Stücke, über die ich etwas wissen sollte? Gibt es eine Möglichkeit, das erste Problem laut zu lösen und nicht alles zu validieren?

+0

vielleicht eine benutzerdefinierte Validierung Syntax 'validate' und andere generische Validierung' validates' Syntax – Viren

+0

@Viren - nur ich bin frage mich, ob ich noch etwas verpasst habe. Ich war nicht in der Lage, eine klare Erklärung für die beiden zu finden, und ich hoffe, dass SO dafür sorgen kann. Ich stimme zu, das ist der einzige Unterschied, den ich bisher gefunden habe. –

+0

Ich beantwortete es mit der Frage des Leuchtturms :) – Viren

Antwort

54

validiert Diese Methode ist eine Verknüpfung zu allen Standardvalidatoren und benutzerdefinierten Validierungsklassen, die mit Validator enden. Beachten Sie, dass Rails-Standardvalidatoren in bestimmten Klassen außer Kraft gesetzt werden können, indem Sie an ihrer Stelle benutzerdefinierte Validierungsklassen wie PresenceValidator erstellen.

validates :title, :body, :presence => true 

Validate fügt eine Validierungsmethode oder Block zu der Klasse. Dies ist nützlich, wenn das Überschreiben der Validierungsinstanzmethode zu unhandlich wird und Sie nach einer aussagekräftigeren Deklaration Ihrer Validierungen suchen.

validate :must_be_friends 

    def must_be_friends 
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee) 
    end 
+0

aus 'Neugier' welches Dokument können Sie den Link anhängen und auch haben Sie es getestet AFAIK funktioniert es nicht – Viren

+0

überarbeitete meine Antwort :) dieses: http: // apidock .com/rails/ActiveModel/Validations/ClassMethods/validates Ich habe die Beispiele tiefer gelesen und das habe ich verstanden, aber es sieht so aus, als hätte ich mich geirrt. Die beschreibenderen http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html – rmagnum2002

+1

Oh, ich wusste nichts über die "Custom Validator-Klassen, die mit Validator" enden, das ist wirklich gut zu wissen . Ich lasse die Frage noch ein wenig länger offen, falls andere Antworten kommen, aber ich werde später wiederkommen, um sie zu akzeptieren. Danke für die Erklärung! –

6

Ich glaube, die :validate Erklärung für individuelle Validierung verwendet wird, wo als :validates für generic Validierung wie presence, uniqueness etc auf einem Feld für ein Verfahren

Die validate Methode mit dem Namen des Parameters sieht verwendet wird, dh Wenn Sie validate :field tun, wird es nach

def field 

end 
suchen

auf Ihrem object. Da Rails eine attr_accessor für jede Datenbank definiert field die validate :field würde die field 's Reader-Methode aufrufen.

Wenn die Validierungsfunktion true zurückgibt oder wenn es eine ist error Objekt, also object.errors nicht leer ist, dann wird das Objekt betrachtet wird valid?

Dies ist der Grund in ligthouse Frage, sie beschweren sich, dass validatesilently bypasses die Validierung :)

Hoffnung des Sinn

+0

Ah, danke für diese Erklärung! Daran hatte ich nicht gedacht, aber es ergibt durchaus Sinn. Es erklärt auch, warum Sie das '' validate' nicht "laut" scheitern lassen konnten, da es ein vollkommen vernünftiger Ruf ist (man könnte sogar sagen "gültig" ...). Daran hatte ich nicht gedacht. –

+0

** Dies ist extrem wichtig. ** _Seriously_ unerwartete Ergebnisse sind aber ein einzelnes Zeichen entfernt. Danke, dass du nicht nur das "Gotcha" gepostet hast, sondern auch die Wissenschaft, die dahinter steckt. Prost! –

Verwandte Themen