Trade Off

supercalifragilisticexpialidocious

Ruby中的write_attribute

有时候想修改一下自己的setter方法,于是会容易犯这样的一个错误:

1
2
3
4
5
6
def password=(pwd)
   @password = pwd
   return if @password.blank?
   create_new_salt
   self.password = xxx
 end

最后那行使用了self.password= xxx,你有没有注意到我们这个方法就是password=,你在自己调用自己,如果有条件停止的话,那这叫递归,如果没有的话,这就是死循环喽,ruby可能会抛出一个stack too deep的错误(rails至少会这样说),此时需要一个magic!

1
write_attribute(:password, User.encrypted_password(self.password, self.salt))

使用write_attribute(xxx,jjj)即可,意思就是把jjj赋值给xxx了,因为此时正好在定义xxx,所以不能用xxx = 这样的方法赋值。

Comments