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?
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
@Mike Ja, die ganze Magie ist im Setter – Vasfed