self.method_nameを使用するときとClassname.method_nameを使用するときを理解しようとしています。Rubyでself.method_nameとClassname.method_nameの使用を理解しようとしています
以下の例では、「before_create」は「self.hash_password」または「hash_password」の代わりに「User.hash_password」を参照する必要があるのはなぜですか?
私はすでにUserクラスに入っているので、before_createメソッドは "hash_password"がそれ自身のクラスのメンバーであり、それを参照する特別な構文は必要ないと "知っている"と考えました。
require 'digest/sha1'
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :password
validates_presence_of :name, :password
validates_uniqueness_of :name
def before_create
self.hashed_password = User.hash_password(self.password)
end
def after_create
@password = nil
end
def self.login(name, password)
hashed_password = hash_password(password || "")
self.find(:first, :conditions => ["name = ? and hashed_password = ?", name, hashed_password])
end
def try_to_login
User.login(self.name, self.password)
end
private
def self.hash_password(password)
Digest::SHA1.hexdigest(password)
end
end
最後の数行はdef self.hash_password(password)を定義しているので、self.hash_passwordはこのメソッドを参照していると考えました。しかし、self.hash_passwordはNoMethodErrorを取得すると言っています。たとえメソッド定義に「self」と書かれています。私はそれを「自己」と呼ぶことはできません。混乱している! –
self.hashed_password =属性ライターを呼び出しますか?しかし、私は属性ライターを定義しませんでした。 1つは自動的に作成されましたか? –
「hashed_password」という名前のデータベース列がある場合は、self.hashed_password =おそらくActiveRecordによって定義されます。 – molf