Rails - Authlogic persistence_token вопрос - PullRequest
0 голосов
/ 18 апреля 2011

Я пытаюсь реализовать функцию сброса пароля, используя учебник по 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.

1 Ответ

2 голосов
/ 18 апреля 2011

Что говорит хтаната.Вы не устанавливаете подтверждение пароля.Можете ли вы дать нам сообщения об ошибках, которые вы получаете?

И, во-первых, вам нужно установить password_confirmation, иначе вы получите ошибки проверки.

...