Rails Callbacks 中的一些困惑

dothide · 2014年01月27日 · 最后由 dothide 回复于 2014年01月28日 · 2320 次阅读

如图所示: 没搞懂的是 encrypt_password 函数中为什么 if 条件后面的 password 不用加 self,而下面的 password_salt 和 password_hash 需要加?

其中 Acct 是这样创建的: rails g model acct email:string password_salt:string password_hash:string

不加 self 试试

#1 楼 @nouse 试了下 password_hash 和 password_salt 在数据库中均为空

看第一句attr_accessor :password。 这里定义了password的访问方法之后,就可以直接用password访问了。 如果你把这一句注释掉的话,那判断的时候也需要加上self

attr_accessor :password相等于定义两个方法:

def password
    @password
end

def password= p
   @password = p
end

如果用password = xxxx只是给一个局部变量赋值,self.password = xxxx才是调用第二个方法。password_salt 同理。如果单用password,那样不会有歧义,所以不需要加 self。

@blueplanet @piecehealth 所以说这个 self 实际上是在这个 model 在保存之前的实例对象,self 就是用来引用它的,而之所以 password 之前没有 self,是因为这个对象并不包含 password 方法或者属性,而是在 Model 层通过 attr_accessor 定义了一个可访问的方法,因此 password 可直接访问,而不需要用 self 对象来调用(其实 self 对象也没有 password 方法),我这么理解对么?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号