2012-03-01 10 views
1

ruby​​ gem BCryptには、そのモジュールの使い方の例があります。ドキュメントから撮影:私たちはself.password_hash属性を持っているときインスタンス変数&self.variableの使用

は、なぜ我々は、すべてのインスタンス変数@passwordを使うのでしょうか?私は何かが欠けているように感じます、おそらく私のルビーの経験がないからです。個人的に、私はと同じであると信じるものを達成しているだろう:次のように

def password 
    self.password_hash ||= Password.new(self.password_hash) 
end 

def password=(new_password) 
    self.password_hash = Password.create(new_password) 
end 
+2

私は答え始めました - しかし、あなたが正しいと分かりました、少し奇妙です。私は '@ password'と'#password_hash'の違いを調べるために、周囲の状況を調べなければならないと思います。私はあなたの方法がうまくいくと思いますが、時にはこれらの2つが異なるように要求する副作用があるかもしれません。私が確かめることのできる唯一のことは、 '@ password'は常にPasswordのインスタンスですが、'#password_hash' _が可能であるように見えますが、常に_そうであるようには見えません。 '#password_hash ='を呼び出すための変更方法がありますか? – Matt

答えて

2

違いがある:パスワードハッシュは、文字列である - パスワードのハッシュ。ただし、Password.new(self.password_hash)Passwordクラスの新しいオブジェクトを作成します。従って、差:StringPasswordStringでは利用できないPasswordオブジェクトのメソッドcostversionなどを呼び出すことができます。

私はあなたが以下の方法が奇妙見つける推測:

def password=(new_password) 
    @password = Password.create(new_password) 
    self.password_hash = @password 
end 

が、何ここで起こる、明らかにされていませんこれはself.password_hash割り当てでStringオブジェクトへのPasswordオブジェクトの変換である - to_s方法はハッシュを返します。その値がデータベースに格納されます。さらに、@passwordインスタンス変数が設定されているため、passwordメソッドはパスワードハッシュStringではなく、Passwordクラスのインスタンスを返します。

+0

ありがとう、それは完璧な意味があります。 docsを振り返ってみると、 'self.password_hash'はデータベースの':string'だと述べています。 +1 –

関連する問題