Неверный оператор при попытке реализовать password_reset Railscast - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь реализовать Railscast # 274 в моем приложении, чтобы я мог предоставить опцию сброса пароля.Я дошел до того, что я могу ввести свою электронную почту в форму для сброса пароля и получить письмо со ссылкой для сброса пароля.Когда я ввожу свой новый пароль и пытаюсь сохранить его, все становится плохо.Я закончил с Action Controller:Exception caught.Вот что показал мой журнал после того, как я отправил себе электронное письмо со ссылкой password_reset:

Started GET "/password_resets/new" for 127.0.0.1 at 2012-01-26 00:50:42 -0500
  Processing by PasswordResetsController#new as HTML

Нажав на ссылку password_reset:

Started GET "/password_resets/qlslPnuOhdyMCNseMnV3bA/edit" for 127.0.0.1 at 2012-01-26 00:51:08 -0500
  Processing by PasswordResetsController#edit as HTML
  Parameters: {"id"=>"qlslPnuOhdyMCNseMnV3bA"}

Добавлениеновый: password и: password_confirmation выдает ошибку:

Started POST "/password_resets/qlslPnuOhdyMCNseMnV3bA" for 127.0.0.1 at 2012-01-26 00:53:08 -0500
  Processing by PasswordResetsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"2egfT2lr35FhuVPWDB72vcS2zPlqC75tcyctRp61ZHw=", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "commit"=>"Update Password", "id"=>"qlslPnuOhdyMCNseMnV3bA"}

Started GET "/profiles/qlslPnuOhdyMCNseMnV3bA" for 127.0.0.1 at 2012-01-26 00:53:09 -0500
  Processing by ProfilesController#show as HTML
  Parameters: {"id"=>"qlslPnuOhdyMCNseMnV3bA"}

  Profile Load (0.9ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" = 'qlslPnuOhdyMCNseMnV3bA' LIMIT 1
PGError: ERROR:  invalid input syntax for integer: "qlslPnuOhdyMCNseMnV3bA"
LINE 1: ...ofiles".* FROM "profiles" WHERE "profiles"."id" = 'qlslPnuOh...
                                                             ^
: SELECT  "profiles".* FROM "profiles" WHERE "profiles"."id" = 'qlslPnuOhdyMCNseMnV3bA' LIMIT 1
Completed   in 57ms

ActiveRecord::StatementInvalid (PGError: ERROR:  invalid input syntax for integer: "qlslPnuOhdyMCNseMnV3bA"
LINE 1: ...ofiles".* FROM "profiles" WHERE "profiles"."id" = 'qlslPnuOh...
                                                         ^
: SELECT  "profiles".* FROM "profiles" WHERE "profiles"."id" = 'qlslPnuOhdyMCNseMnV3bA' LIMIT 1):
  app/controllers/profiles_controller.rb:41:in `show'

В profile_controller.rb: 41 в show:

def show
  @profile = Profile.find(params[:id])
  @user = User.find(@profile.user_id)
  ..
end

Перед этим я сбросил свою базу данных, побежал rake:db create, затем rake:db migrate, прежде чем повторно посеять БД.Может ли это быть из-за того, что я не запустил скрипт для предоставления существующим пользователям password_reset_token?

UPDATE: Включая password_resets_controller.rb:

класс PasswordResetsController

  def create
    @user = @User.find_by_email(params[:email])
    if user
      user.send_password_reset
      redirect_to new_password_reset_path, :notice => "Check your email for password reset instructions."
    else
      redirect_to new_password_reset_path, :notice => "Sorry, we couldn't find that email. Please try again."
    end
  end

  def edit
    @user = User.find_by_password_reset_token!(params[:id])
  end

  def update
    @user = User.find_by_password_reset_token!(params[:id])
    if @user.password_reset_sent_at < 2.hours.ago
      redirect_to new_password_reset_path, :alert => "Your password reset link has expired."
    elsif @user.update_attributes(params[:user])
      redirect_to profile_path, :notice => "Great news: Your password has been reset."
    else
      render :edit
    end
  end
end

1 Ответ

1 голос
/ 27 января 2012

Похоже, проблема в вашем PasswordResetsController#update:

def update
  @user = User.find_by_password_reset_token!(params[:id])
  if @user.password_reset_sent_at < 2.hours.ago
    redirect_to new_password_reset_path, :alert => "Your password reset link has expired."
  elsif @user.update_attributes(params[:user])
    redirect_to profile_path, :notice => "Great news: Your password has been reset."
  else
    render :edit
  end
end

В частности, redirect_to profile_path.

Если вы посмотрите журналы, вы увидите следующую последовательность:

POST "/password_resets/qlslPnuOhdyMCNseMnV3bA"
GET  "/profiles/qlslPnuOhdyMCNseMnV3bA"

и маршруты должны быть /password_resets/:id и /profiles/:id. /password_resets хочет токен 'qlslPnuOhdyMCNseMnV3bA', но /profiles хочет числовой идентификатор пользователя.

Возвращаясь к контроллеру, мы видим это:

redirect_to profile_path, :notice => "Great news: Your password has been reset."

Вы не сообщаете profile_path, какого пользователя использовать, поэтому, очевидно, он набирает params[:id], чтобы создать неправильный /profiles/qlslPnuOhdyMCNseMnV3bA URL. Попробуйте указать profile_path, какого пользователя использовать с чем-то вроде этого:

redirect_to profile_path(@user), :notice => "Great news: Your password has been reset."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...