パスワードを変更するために、ユーザーに現在のパスワードを正常に確認してもらいたい。最初はcontroller#updateに何かあったのですが、仮想属性にエラーを追加しても保存が妨げられなかったのでインスタンスが無効にならないようです。
has_secure_password を使用しています。モデルの検証に切り替えましたが、認証が false を返すため、以下のコードは常に検証に失敗します。コンソールでいくつかのテストを行ったところ、
user = User.first
user.current_password = 'thecurrentpassword'
user.password = 'thenewpassword'
user.valid? => false
user.authenticate('thecurrentpassword') => false
user.authenticate('thenewpassword') => true ... before saving
それで、保存の代わりに新しいパスワードの割り当て時に password_digest がリセットされるようですか? モデルまたはコントローラーレイヤーで current_password が間違っている場合、これを回避してレコードが保存されないようにするにはどうすればよいですか?
validate :validate_current_password, if: Proc.new{ |u| u.persisted? and u.password.present? }
def validate_current_password
unless authenticate(current_password)
errors.add(:current_password, 'invalid password')
end
end