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_pa​​ssword”它不会工作?

你缺少周边类,这属于。据推测它属于一个用户等级:

 
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=()。 :)

+0

“*可能*将值分配给本地变量”? 'something =“...”'总是会创建一个局部变量。如果在LHS中没有'.',那么你正在创建一个局部变量。如果有'.',你正在调用setter方法。 – 2011-06-03 00:34:08

+0

好吧,奇怪的事情发生,如果你以前使用self.something = ...我怀疑rails首先使用method_missing,但是当它被调用时,它使真正的方法。从那一刻起它就使用访问器。 – DGM 2011-06-03 02:41:02

是你基本上是正确的,因为这实际上只是简写

self.hashed_password == hashed_password == Admin.... 

所以什么都不会工作