2016-04-06 7 views
0

Ich habe ein paar Zeilen in meinem Benutzermodell, um Lead/Leerzeichen von der E-Mail und dem Passwort des Benutzers zu entfernen. Der ursprüngliche Code sah wie folgt aus:Rails-Modell: before_save {self.password = password.strip} vs. before_save {password.strip!}

before_save {self.email = email.strip} 
before_save {self.password = password.strip} 
before_save {self.password_confirmation = password_confirmation.strip} 

Das ist mein Test bestanden:

test "password entry should ignore leading/tailing whitespace" do 
@user = User.create(name: "M", email: " [email protected]", 
    password: " password", password_confirmation: " password") 
assert @user.authenticate("password") 
assert_not @user.authenticate(" password") 
end 

Jetzt habe ich versucht, neu zu Faktor es:

before_save {email.strip!} 
before_save {password.strip!} 
before_save {password_confirmation.strip!} 

Dies funktioniert für meine E-Mail-Test in Ordnung, aber es ist der Passwort-Test oben gebrochen. Die Frage ist also, wie unterscheidet sich die ursprüngliche Version tatsächlich von dem re-factored Code?

Antwort

0

Sie können password.strip! nicht verwenden, da es in der Tat kein solches Feld wie password gibt - es ist ein Setter password=, der Kennwort-Hash generiert und speichert.

+0

Ich denke, ich verstehe es. Obwohl es eine Lesemethode für @password gibt, tritt der Code, bei dem das Passwort verschlüsselt wird, nur in der Setter-Methode auf. So kann ich self.password.strip !, aber es übergibt das Ergebnis nicht an die Hash-Funktion. Es ändert die Instanzvariable, aber die Änderung führt nicht zur Datenbank. Die ursprüngliche Version hat funktioniert, weil sie stattdessen die Setter-Methode verwendet. Klingt das richtig? – Mike

+0

@Mike Ja, die ganze Magie ist im Setter – Vasfed