Rails的认证\简单的Ruby问题
问题描述:
这似乎很简单,但我有点困惑Rails的认证简单的Ruby问题
下面是一些简单的验证码:
def self.authenticate(username="", password="")
user = AdminUser.find_by_username(username)
if user && user.password_match?(password)
return user
else
return false
end
end
def password_match? (password)
hashed_password == AdminUser.hash_with_salt(password, salt)
end
我的问题是,在高清password_match?怎么做它有权访问用户对象内部的内容?因为用户调用它?所以如果它说“hashed_pwd”而不是“hashed_password”它不会工作?
答
你缺少周边类,这属于。据推测它属于一个用户等级:
class User def self.authenticate(username="", password="") user = AdminUser.find_by_username(username) if user && user.password_match?(password) return user else return false end end def password_match? (password) hashed_password == AdminUser.hash_with_salt(password, salt) end end
所以是的,它是这个类的一个方法。
user = User.authenticate("joe","12345") user.password_match?("12345")
注意一个被称为一个类,一个被称为从该类实例化的对象。
正如保罗所说,它是self.hashed_password
一个快捷方式......但是你可以分配给它,当使用该快捷方式,特别是陷入困境 - 在这种情况下 hashed_password = "..."
,红宝石可能不知道它是否是一个方法或变量,并且它可以将该值分配给局部变量,而不是像您期望的那样调用hashed_password=()
方法。分配给属性时始终使用self.hashed_password=()
。 :)
答
是你基本上是正确的,因为这实际上只是简写
self.hashed_password == hashed_password == Admin....
所以什么都不会工作
“*可能*将值分配给本地变量”? 'something =“...”'总是会创建一个局部变量。如果在LHS中没有'.',那么你正在创建一个局部变量。如果有'.',你正在调用setter方法。 – 2011-06-03 00:34:08
好吧,奇怪的事情发生,如果你以前使用self.something = ...我怀疑rails首先使用method_missing,但是当它被调用时,它使真正的方法。从那一刻起它就使用访问器。 – DGM 2011-06-03 02:41:02