0
ユーザーモデルには、ユーザーの電子メールとパスワードから先頭/末尾の空白を削除するための行がいくつかあります。Railsモデル:before_save {self.password = password.strip}対before_save {password.strip!}
before_save {self.email = email.strip}
before_save {self.password = password.strip}
before_save {self.password_confirmation = password_confirmation.strip}
これは私のテストに合格した:元のコードはこのように見えた
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
今私はそれをファクタし直すことを試みた:
before_save {email.strip!}
before_save {password.strip!}
before_save {password_confirmation.strip!}
これは私の電子メールのテストのために正常に動作し、上記のパスワードテストが壊れています。ですから、元のバージョンと実際に再入荷されたコードとはどう違うのですか?
私はそれを得ると思います。したがって、@passwordのリーダメソッドがある間、パスワードがハッシュされるコードはsetterメソッドでのみ発生します。だから私はself.password.strip!を呼び出すことができますが、結果はハッシュ関数に渡されません。それはインスタンス変数を変更しますが、その変更はデータベースに反映されません。元のバージョンは、代わりにsetter-methodを使用していたため動作しました。それは正しいと思いますか? – Mike
@Mikeはい、すべての魔法はセッターにあります – Vasfed