2012-01-26 2 views
0

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

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_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' 

в profiles_controller.rb: 41 в show:

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

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

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

класса PasswordResetsController < ApplicationController Защиты нового конца

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 
+0

Обновлено кодом моего контроллера. Я также добавил вторую строку в 'profiles_controller.rb'. – tvalent2

ответ

1

Похоже, проблема в вашем 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." 
+0

Спасибо! Это заставило меня пройти мою ошибку, но не обновляло мою модель User. Он перенаправил меня на версию logged_out моего профиля вместо logged_in. – tvalent2

+0

@ tvalent2: попробуйте подписать своего пользователя перед 'redirect_to profile_path (@user)'. Оригинал, из которого вы работаете, ожидает, что он выполнит вход вручную после сброса пароля. –

+0

Спасибо, я попробую.Оказывается, у меня не было 'attr_accessible: password,: password_confirmation' в моей модели User. Не уверен, что это поможет ... – tvalent2

Смежные вопросы