2016-04-06 4 views
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!} 

これは私の電子メールのテストのために正常に動作し、上記のパスワードテストが壊れています。ですから、元のバージョンと実際に再入荷されたコードとはどう違うのですか?

答えて

0

実際にはpasswordというフィールドはないので、password.strip!を使用することはできません。パスワードハッシュを生成して保存するのはセッターpassword=です。

+0

私はそれを得ると思います。したがって、@passwordのリーダメソッドがある間、パスワードがハッシュされるコードはsetterメソッドでのみ発生します。だから私はself.password.strip!を呼び出すことができますが、結果はハッシュ関数に渡されません。それはインスタンス変数を変更しますが、その変更はデータベースに反映されません。元のバージョンは、代わりにsetter-methodを使用していたため動作しました。それは正しいと思いますか? – Mike

+0

@Mikeはい、すべての魔法はセッターにあります – Vasfed

関連する問題