我试图了解何时使用self.method_name和何时使用Classname.method_name.
在下面的例子中,为什么“before_create”需要引用“User.hash_password”而不是“self.hash_password”或“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 before_create self.hashed_password = User.hash_password(self.password) end
在此示例中,User.hash_password调用User类的hash_password方法,而self.hashed_password =调用User的特定实例上的hashed_password =方法.
如果将User.hash_password替换为self.hash_password,则Ruby将抱怨NoMethodError,因为在User类中不存在名称为hash_password的实例方法.你可以用self.class.hash_password替换它.
如果用简单的hashed_password =替换self.hashed_password =,Ruby将创建一个名为hashed_password的本地变量,而不是调用实例方法hashed_password =.如果要调用属性编写器,则需要显式添加自身.
方法定义中的self(def self.hash_password)使hash_password成为一种类方法,而不是实例方法.在这种情况下,自我指的是类.在实例方法的上下文中,self指的是一个实例.