所以我之前写了一个应用程序允许使用这个加密密码的标准方法,它工作正常:
before_save :create_hashed_password
然后:
def create_hashed_password
# validation code not shown
self.password = Digest::SHA1.hexdigest(password)
end
现在在这个应用程序中的问题是我有其他用户属性我想编辑,每次编辑和保存时,我都会散列已经散列的密码,因此在更新后无法登录。
我在irb中对此进行了测试并且有效:
irb(main):008:0> t.password = 'password'
=> "password"
irb(main):009:0> t.password_changed?
=> true
但是当我在之前的过滤器中使用这一行时:
before_save :create_hashed_password if password_changed?
失败并出现以下错误:
NoMethodError: undefined method `password_changed?' for User(no database connection):Class
(在你问之前,是的,我确实有一个数据库连接,它只是用户模型,因为前面的过滤器就在那里)
BTW我在Rails 4上。
答案 0 :(得分:2)
尝试:
before_save :create_hashed_password, if: :password_changed?
简短说明:在您当前的语法中,if
部分不是before_save
方法的参数,这就是您需要添加昏迷的原因,以便发送它作为参数。现在它尝试调用类方法:User.password_changed?
,这没有意义,因为您需要对用户对象执行实例方法。
答案 1 :(得分:0)
试试这个:
before_save :create_hashed_password, if: Proc.new { &:password_changed? }
希望这有帮助,快乐编码