Rails 4 before_save属性改变了加密密码

时间:2014-04-02 18:38:35

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

所以我之前写了一个应用程序允许使用这个加密密码的标准方法,它工作正常:

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上。

2 个答案:

答案 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? }

希望这有帮助,快乐编码