2011-12-27 14 views
0

私はRuby on Railsの新機能です。アクティブレコードコールバックの使用を中止しました。私は方法を知っているを使用するが、私は本当にしようとしている何が起こっている、と私はそれを取得していない。私の混乱は、Rubyの可変スコープと関係しています。ここでアクティブレコードコールバック。彼らはどのように変数/スコープにアクセスできますか?

は、フィールドを持つユーザーのためのシンプルなのActive Recordクラスです:電子メール、password_hash、この方法では

class User < ActiveRecord::Base 

    attr_accessor :password 
    before_save :encrypt_password 

    #validation 
    validates :password, :confirmation => true 
    validates :email, :password, :presence => true 
    validates :email, :uniqueness => true 

    #When saving the user, encrypt the password 
    def encrypt_password 

     #First check if the password is present 
     if (password.present?) 

      #encrypt the password 
      self.password_salt = BCrypt::Engine.generate_salt 
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt) 
     end 

    end 

end 

をpassword_salt "encrypt_password"、どのように変数 "パスワード" はアクセス可能でしょうか? self.password(object var?)と同じですか?これは@passwordと同じではありませんか? (なぜ?)

実際の暗号化ルーチンでは、私はself.password_saltを呼び出します。私は単に "password_salt"(自己を参照することなく)をタイプすることができ、動作しないことに気づいた。何故なの?なぜこれは@password_saltと異なるのですか?

申し訳ありませんこれはnoobishとして出会えば、私はこれを離れてバッシングをするのに十分な時間を費やしました。私はこれを理解するのに苦労しています。

答えて

2

1)self.passwordと同じです。 ActiveRecordは、データベースに関連するものにアクセスするためのインスタンス変数ではなく、メソッドを定義します。そのため、@passwordでアクセスできません。

2)self.password_salt=を使用する必要があります。それ以外の場合は、メソッド呼び出しを行わずにローカル変数を割り当てるためです。

PS:コールバックは、オブジェクトのメソッド呼び出しのみです。唯一の違いは、Railsがあなた自身ではなくあなたのために呼び出すことです。

+0

それだけです。説明をありがとう。 :) –

関連する問題