2013-03-20 18 views
10

我做的Rails tutorial by Michael Hartl,和我来的地步,你只需添加:has_secure_password在我的模型类中如何工作?

has_secure_password 

你的模型类和一堆魔法发生。

据我所知,这种方法来自ActiveModel::SecurePassword模块,该模块包含在我的模型类扩展的ActiveRecord::Base中。

我不明白的是什么,当我去添加这一行到我的类定义。有人可以请尽可能详细地解释。我真的很想知道发生了什么,而不是仅仅在我的应用程序中抛出东西,而不知道它是如何工作的。

(如果它有助于理解为什么我很困惑,我来自一个Java的背景,我是新来的Ruby)

+0

我认为这可能足以这一行注释的,乡亲们。 – 2013-03-20 05:35:58

回答

8

的理解最简单的方法是什么什么的做的是咨询的源泉!在这种情况下,那将是ActiveModel::SecurePassword documentation。从这一点,你可以看到has_secure_password做到这一点:

def has_secure_password 
    # Load bcrypt-ruby only when has_secure_password is used. 
    # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library. 
    gem 'bcrypt-ruby', '~> 3.0.0' 
    require 'bcrypt' 

    attr_reader :password 

    validates_confirmation_of :password 
    validates_presence_of  :password_digest 

    include InstanceMethodsOnActivation 

    if respond_to?(:attributes_protected_by_default) 
    def self.attributes_protected_by_default 
     super + ['password_digest'] 
    end 
    end 
end 

以英语解释,这个功能:

  1. 加载bcrypt-ruby宝石,需要bcryptbcrypt是一个安全的哈希函数,您可以在维基百科中了解更多信息。
  2. 添加只读属性称为password模型。
  3. 将验证密码是由另一场证实,被称为password_confirmation。换句话说,您必须输入密码两次才能确认。
  4. 确保password_digest存在一个模型保存之前。
  5. 加载instance methods,在本例中为authenticate(如果密码正确,则返回true,否则为false)和password=,它将传递的密码加密到password_digest属性中。
  6. 如果方法有默认的保护属性,这也将增加password_digest受保护的属性该列表。 (因此防止它被批量分配。)

您可以在ActiveModel::SecurePassword documentationfurther documentation on its instance attributes了解更多信息。

+0

我在发布之前查看了源代码。令我困惑的是,在请求方法中间,“require”和“include”正好坐在一起。我来自Java,所以当我看到'require'时,我的脑海里就说'import',它在Java中只在语法上有效。坐在方法中间的'attr_reader'也有点混乱。我经历了Ruby Koans,不记得遇到过这样的事情,但是我又一次以很快的速度吹响了它。我似乎在这里错过了一些基本的Ruby。你能为我指出正确的方向吗? – 2013-03-20 04:08:44

+0

与Java相反,在Ruby中,您可以在类中的任何位置“需要”从其他来源获取新的类和方法。 'attr_reader'是一个访问器:你可以在这里阅读更多关于它们的信息(http://www.rubyist.net/~slagell/ruby/accessors.html)(或者只是谷歌的Ruby访问器)。 – Veraticus 2013-03-20 04:13:15

+0

是的,但访问器是在方法中间声明的,在我的类包含的模块内部。我在访问器(包括链接)上看到的每个示例都将它们的用法显示为类定义的一部分。我不确定它与我调用此方法的类的关系如何。 – 2013-03-20 04:23:47

相关问题