如图所示: 没搞懂的是 encrypt_password 函数中为什么 if 条件后面的 password 不用加 self,而下面的 password_salt 和 password_hash 需要加?
其中 Acct 是这样创建的: rails g model acct email:string password_salt:string password_hash:string
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
password
self
attr_accessor :password相等于定义两个方法:
def password @password end def password= p @password = p end
如果用password = xxxx只是给一个局部变量赋值,self.password = xxxx才是调用第二个方法。password_salt 同理。如果单用password,那样不会有歧义,所以不需要加 self。
password = xxxx
self.password = xxxx
@blueplanet @piecehealth 所以说这个 self 实际上是在这个 model 在保存之前的实例对象,self 就是用来引用它的,而之所以 password 之前没有 self,是因为这个对象并不包含 password 方法或者属性,而是在 Model 层通过 attr_accessor 定义了一个可访问的方法,因此 password 可直接访问,而不需要用 self 对象来调用(其实 self 对象也没有 password 方法),我这么理解对么?