Rails身份验证\简单的Ruby问题

时间:2011-06-02 23:40:30

标签: ruby-on-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

我的问题是,在def password_match?中,它如何访问用户对象中的内容?因为用户叫它吗?所以,如果它说“hashed_pwd”而不是“hashed_pa​​ssword”那么它会起作用吗?

2 个答案:

答案 0 :(得分:3)

你错过了它所属的周围类。据推测它属于User类:

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 = "..."在这种情况下,ruby可能不知道它是方法还是变量,它可能会将值赋给局部变量,而不是像您期望的那样调用hashed_password=()方法。分配属性时始终使用self.hashed_password=()。 :)

答案 1 :(得分:1)

是的,你基本上是正确的,因为这只是

的简写
self.hashed_password == hashed_password == Admin....

所以其他任何东西都行不通