简体   繁体   中英

Rails 4 before_save attribute changed encrypting password

So I wrote an app before that allowed for the standard way of encrypting a password using this and it worked fine:

before_save :create_hashed_password

Then:

def create_hashed_password
  # validation code not shown
  self.password = Digest::SHA1.hexdigest(password)
end

The problem is now in this app is that I have other user attributes I want to edit and every time I edit and save, I am hashing the already hashed password, thus making login impossible after updating.

I tested this in irb and it works:

irb(main):008:0> t.password = 'password'
=> "password" 
irb(main):009:0> t.password_changed?
=> true

But when I use this line in the before filter:

before_save :create_hashed_password if password_changed?

It fails with the following error:

NoMethodError: undefined method `password_changed?' for User(no database connection):Class

(And before you ask, yes I do have a db connection, it's just with the User model because the before filter is there)

BTW I'm on Rails 4.

Try with:

before_save :create_hashed_password, if: :password_changed?

Short explanation : in your current syntax, the if part is not a param to the before_save method, this is why you need to add the coma, to send it as a parameter. Now it tries to call a class method: User.password_changed? , this doesn't make sense since you need to perform an instance method against a user object.

Try this:

before_save :create_hashed_password, if: Proc.new { &:password_changed? }

Hope this helps, happy coding

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM