2009-11-04 4 views
11

Ich habe ein Benutzermodell mit den üblichen Attributen wie E-Mail und hashed_password usw. Ich möchte eine Validierung schreiben, die auf die Präsenz prüft eine E-Mail-Adresse, sondern nur dann, wennRails Validierung für Benutzer E-Mail - nur validieren, wenn ein Benutzer sich anmeldet oder E-Mail-Adresse aktualisiert

1) es nicht einen in der Datenbank für dieses Objekt (dh dies ist ein neuer Benutzer anmelden)

2) der Benutzer ihre E-Mail versucht, aktualisieren gespeichert ist Adresse .

Meine aktuelle Validierungen

validates_presence_of :email 
    validates_presence_of :email_confirmation 

    validates_confirmation_of :email 

verhindert offensichtlich von mir alle Attribute zu aktualisieren. Ich dachte an

validates_presence_of: email,: if: email_validation_required?

def email_validation_required? 
self.email.blank? 
end 

Aber das wird nicht Hilfe bei Szenario 2 wie es wahr zurück, weil der Benutzer eine E-Mail Adresse Passwort in der db hat.

Ich kann nicht herausfinden, wie ich es auf nur diese 2 Szenarien oben begrenzen kann.

Kann jemand helfen?

Antwort

18

Ich denke, dass EmFi etwas angeht. Aber ich glaube nicht, dass die validates_presence_of :email dich halten sollte. Die email sollte immer vorhanden sein - wenn es leer in der Form bleibt, wird der Parameter nicht mit Ihrem Speichern des Benutzers unordentlich. Wenn es in das Formular eingegeben wird, sollte es auch für das Update eine email_confirmation für die Fahrt haben.

dieses Probieren Sie:

validates_presence_of :email 
validates_presence_of :email_confirmation, :if => :email_changed? 

validates_confirmation_of :email 
+0

Entschuldigung für die späte Antwort Barry, Ihr Recht darüber nicht halten mich auf. Ich habe gerade den Code für password_confirmation für email_confirmation repliziert, aber das hat andere Anforderungen. Danke, dass du es aufgezeigt hast. – robodisco

10

Sie haben zwei Möglichkeiten. Eines ist zu verwenden :on. Standardmäßig werden sie auf gesetzt, aber man kann so etwas wie dies diese

validates_presence_of :email, :on => :create 

oder

validates_presence_of :email, :on => :update 

die anderen Optionen sind :if tun zu verwenden, und dann in einem Methodennamen übergeben oder einem proc . so etwas wie

validates_presence_of :email, :if => :should_validate 

oder

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 } 

Hoffnung, das hilft :)

+0

hallo matt Dank für Ihnen helfen. Ich hatte darüber nachgedacht, eine Methode zu verwenden mit: wenn, aber ratlos wurde, wie man die Logik darin schreibt. Ich fragte mich, ob es einen Weg gab, ohne meinem Modell weitere Attribute hinzufügen zu müssen. Ich bemerke in Ihrem letzten Beispiel, dass Sie ein signup_stage Attribut erwähnen. – robodisco

+0

Ich habe nur ziemlich generische Beispiele gegeben. Wenn Sie Ihre Frage erneut lesen, warum ist die E-Mail in Ihrem Modell leer, wenn der Benutzer ein Kennwort in der Datenbank hat? –

+0

Entschuldigung, dass das Passwort ein Tippfehler war - es hätte eine E-Mail lesen sollen. Bearbeitet den Beitrag. – robodisco

3

Sie wollen ein verwenden: wenn Klausel über die Validierung, die die Active :: Schmutzige Methoden verwendet:

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?} 

NB Funktioniert nur in Rails 2.1 oder höher.