Я пытаюсь реализовать функцию сброса пароля, используя учебник по http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/
и сталкиваются с трудностями. Проблемы, похоже, возникают из-за того, что persistence_token
не соответствует тому, что находится в базе данных.
Когда persistence_token
устанавливается / обновляется?
Мой код сброса пароля выглядит точно так же, как учебник, и вот он:
class PasswordResetsController < ApplicationController
before_filter :require_no_user
before_filter :load_user_using_perishable_token, :only => [ :edit, :update ]
def create
@user = User.find_by_email_address(params[:email])
if @user
@user.deliver_password_reset_instructions!
flash[:notice] = "Instructions to reset your password have been emailed to you"
redirect_to login_path
else
flash.now[:error] = "No user was found with email address #{params[:email]}"
render :action => :new
end
end
def update
@user.password = params[:password]
if @user.save
flash[:success] = "Your password was successfully updated"
redirect_to @user
else
render :action => :edit
end
end
private
def load_user_using_perishable_token
@user = User.find_using_perishable_token(params[:id])
unless @user
flash[:error] = "We're sorry, but we could not locate your account"
redirect_to new_password_reset_path
end
end
Метод load_user_using_perishable_token
корректно загружает значение из базы данных, однако вызов @user.password = params[:password]
изменяет peristence_token
на другой. Последующий вызов @user.save
завершается ошибкой, поскольку он не может найти запись с измененным persistence_token
.
Любые идеи, как решить эту проблему, очень помогли бы.
Редактировать для уточнения:
1) Нет ошибки, @ user.save возвращает false.
@ user.save запускает следующий SQL-запрос:
SELECT `users`.id FROM `users` WHERE (`users`.`persistence_token` =
BINARY '53a6fd82a1da50c299230afd2b7911e7774f6fd62a714909194d5d84e2094444d808a71992bb8b11bc572fd865e9956681dea61bf46e3f65d9d41c53a6b0ec90' AND `users`.id <> 7) LIMIT 1
Значение persistence_token, используемое в запросе, не соответствует значению базы данных.
2) Я не уверен, что это подсказка, но в отладчике я замечаю, что всякий раз, когда
@ user.password = params [: пароль] устанавливается, значение persistence_token изменяется в объекте @user.