在下面的例子中,为什么“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指的是一个实例.
原文地址:https://www.jb51.cc/ruby/273119.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。