活动记录回调。他们如何能够访问变量/范围?

时间:2011-12-27 18:40:04

标签: ruby-on-rails-3 activerecord

我是Ruby on Rails的新手,而且我还在忙着使用Active Record回调。我知道如何使用它们,但我正在努力理解正在发生的事情,而我却没有得到它。我的困惑与Ruby中的变量范围有关。

以下是具有字段的用户的简单Active Record类:email,password_hash,password_salt

class User < ActiveRecord::Base

    attr_accessor :password
    before_save :encrypt_password

    #validation
    validates :password, :confirmation => true
    validates :email, :password, :presence => true
    validates :email, :uniqueness => true

    #When saving the user, encrypt the password
    def encrypt_password

        #First check if the password is present
        if (password.present?)

            #encrypt the password
            self.password_salt = BCrypt::Engine.generate_salt
            self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
        end

    end

end

在方法“encrypt_password”中,变量“password”如何可访问?它与self.password(object var?)相同,是否与@password不同? (为什么?)

在实际的加密例程中,我调用了self.password_salt。我注意到我可以简单地输入“password_salt”(不参考self),但它不起作用。为什么不?为什么这与@password_salt不同?

对不起,如果这件事发生了讽刺,我花了好几个小时抨击这个,我很难理解这一点。

1 个答案:

答案 0 :(得分:3)

1)它与self.password相同。 ActiveRecord定义方法,而不是实例变量来访问与数据库相关的东西。这就是您无法使用@password访问它的原因。

2)您需要使用self.password_salt=,否则您将分配一个局部变量,而不是进行方法调用。

PS:回调只是对象的方法调用。唯一的区别是Rails会为你调用它们,而不是你自己。