2013-08-10 14 views
1

Я создаю приложение Rails 4 с помощью «зазора» для проверки подлинности. Я вроде застряли со следующей проблемой:Рельсы 4 с ошибкой сброса пароля

Когда пользователь забывает его/ее пароль, и хотел бы установить новый пароль, пользователь не найден. (Но есть в БД), это лог-сервер:

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-10 21:00:58 +0200 
Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "password_reset"=>"[FILTERED]", "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL AND "users"."confirmation_token" = 'bcc6a5b49bc64628eff15bf92761fe1775ef252c' LIMIT 1 
    Rendered passwords/new.html.slim within layouts/application (0.9ms) 
    Rendered partials/_favicon_styles.html.slim (0.4ms) 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (11.2ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (1.0ms) 
Filter chain halted as :forbid_non_existent_user rendered or redirected 
Completed 200 OK in 38ms (Views: 33.0ms | ActiveRecord: 2.3ms) 

Но когда пользователь вошел в систему, он или она может изменить пароль, а также вход работает нормально ..

Я думаю, что проблема в запросе я отправляю идентификатор с формой, но когда id достигает запроса, он говорит, что NULL. Но я боролся с этим часами, но не могу найти решение.

Также является запрос 7 раз для кэша проблема?

Заранее благодарен!

Update

Изменены сильные параметры и 'find_user_by_id_and_confimatrion_token' метод, а затем:

def find_user_by_id_and_confirmation_token 
    Clearance.configuration.user_model. 
    find_by_id_and_confirmation_token params[:**id**], params[:token].to_s 
    end 

This was :user_id, this is not the name of the params.

def password_reset_params 
    # if params.has_key? :user 
    # ActiveSupport::Deprecation.warn %{Since locales functionality was added, accessing params[:user] is no longer supported.} 
    # params[:user][:password] 
    # else 
    # params[:password_reset][:password] 
    # end 

    params.require(:password_reset).permit(:password_reset, :password, :token, :id) 
    end 

Но это бросает в другую ошибку:

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-11 16:31:20 +0200 
    Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "password_reset"=>"  [FILTERED]", "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'd892a4698f5eff29e34378716ebd46414ad6e8cf' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'd892a4698f5eff29e34378716ebd46414ad6e8cf' LIMIT 1 
    (0.4ms) BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    (0.4ms) ROLLBACK 
    Rendered passwords/edit.html.slim within layouts/application (1.2ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (4.7ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (0.4ms) 
Completed 200 OK in 112ms (Views: 12.5ms | ActiveRecord: 4.1ms) 

В нем говорится, что пользователь уже существует и откатывает изменения. Поскольку это обновление, пользователь должен существовать.

Update 2

Я все еще пытаюсь решить эту проблему, то здесь разница между вошедшего в систему пользователя, который редактируя свой пароль, и с помощью пароля забыть метод (не вошли в систему)

Помнить меняющийся пароль пользователя

Started PATCH "/admin/users/1" for 127.0.0.1 at 2013-08-13 16:12:07 +0200 
    Processing by Admin::UsersController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"password"=>"  [FILTERED]", "password_confirmation"=>"[FILTERED]"}, "id"=>"1"} 
    User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'f1078c2b74f6b3b3c9950b87a5b927db3f2bffcd' LIMIT 1 
    User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1(0.4ms)  
    BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    SQL (1.6ms) UPDATE "users" SET "encrypted_password" = $1, "updated_at" = $2 WHERE "users"."id" = 1 [["encrypted_password", "$2a$10$F4p6N0va/TY2nKOiXOSQ7e23NnHPyDytQZ6EvhtGd7FJ2oTMVFbSS"], ["updated_at", Tue, 13 Aug 2013 16:12:07 CEST +02:00]](12.6ms) 
    COMMIT 
    Rendered admin/users/edit.html.slim within layouts/application (8.7ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    Rendered partials/_olderbrowser.html (0.0ms) 
    Rendered partials/_navigation.html.slim (2.6ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    Rendered partials/_footer.html.slim (0.1ms) 
Completed 200 OK in 167ms (Views: 23.0ms | ActiveRecord: 17.3ms) 

пользователя, который забыт пароль и вступит новый PASSW ога

Started PUT "/passwords/1?token=[FILTERED]" for 127.0.0.1 at 2013-08-13 16:58:45 +0200 
    Processing by PasswordsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"password"=>"[FILTERED]"}, "token"=>"[FILTERED]", "id"=>"1"} 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'b198361b098c1bf110a2171dd7f00258d9ca9240' LIMIT 1 
    CACHE 
    (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 AND "users"."confirmation_token" = 'b198361b098c1bf110a2171dd7f00258d9ca9240' LIMIT 1 
    (0.3ms)BEGIN 
    User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 
    (0.2ms) ROLLBACK 
    Rendered passwords/edit.html.slim within layouts/application (1.4ms) 
    Rendered partials/_favicon_styles.html.slim (0.3ms) 
    Rendered partials/_olderbrowser.html (0.0ms) 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_navigation.html.slim (5.0ms) 
    Rendered partials/_notification.html.slim (0.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '' LIMIT 1 
    Rendered partials/_footer.html.slim (0.5ms) 
Completed 200 OK in 102ms (Views: 14.7ms | ActiveRecord: 2.0ms) 

Еще ожидать Put метод/Patch и все оповещения кэша. Мне кажется, что это тоже не так. Я попытался использовать http-метод patch, но это не помогло.

Update 3

Кроме того, мой код контроллера, его почти так же, как разминирование :: PasswordsController. Удалены методы, которые не вызываются моей проблемой.

require 'active_support/deprecation' 

class PasswordsController < ApplicationController 

skip_before_filter :authorize, :only => [:create, :edit, :new, :update] 
before_filter :forbid_missing_token, :only => [:edit, :update] 
before_filter :forbid_non_existent_user, :only => [:edit, :update] 

def edit 
    @user = find_user_for_edit 
    render :template => 'passwords/edit' 
end 

def update 
    @user = find_user_for_update 

    if @user.update_attributes(password: password_reset_params) 
    sign_in @user 
    redirect_to url_after_update 
    else 
    flash_failure_after_update 
    render :template => 'passwords/edit' 
    end 
end 

private 

def password_reset_params 
    if params.has_key? :user 
    ActiveSupport::Deprecation.warn %{Since locales functionality was added, accessing params[:user] is no longer supported.} 
    params[:user][:password] 
    else 
    params[:password_reset][:password] 
    end 
end 

def find_user_by_id_and_confirmation_token 
    Clearance.configuration.user_model. 
    find_by_id_and_confirmation_token params[:id], params[:token].to_s 
end 

def find_user_for_edit 
    find_user_by_id_and_confirmation_token 
end 

def find_user_for_update 
    find_user_by_id_and_confirmation_token 
end 

def forbid_missing_token 
    if params[:token].to_s.blank? 
    flash_failure_when_forbidden 
    render :template => 'passwords/new' 
    end 
end 

def forbid_non_existent_user 
    unless find_user_by_id_and_confirmation_token 
    flash_failure_when_forbidden 
    render :template => 'passwords/new' 
    end 
end 
end 
+1

Вы каким-то образом получили двух пользователей в своей базе данных с тем же адресом электронной почты? Похоже, что действие обновления проверяет уникальность электронной почты и не удается (путем поиска второго пользователя «[email protected]». – bgates

+0

Нет нет только двух тестовых учетных записей в БД с разными адресами электронной почты. У меня была эта проблема раньше, для подписываемых пользователей, но отключение индекса для электронной почты в таблице «Пользователи» снова давало доступ. Не уверен, если это связано, но почему-то я думаю, что это так. – Loed

+0

Как выглядит 'PasswordController # update'? – bgates

ответ

0

Вы должны отследить, где следующий запрос SQL в настоящее время запускается из:

User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 1) LIMIT 1 

Это линия, которая вызывает ваш сохранить на провал. Я предполагаю, что у вас есть валидация или какой-либо другой обратный вызов в вашей модели User, которая срабатывает при вызове @user.update_attributes. Ошибка проверки/обратного вызова, что приводит к сбою сохранения.

+0

Спасибо! Это произошло, это была неудачная проверка наличия «password_confirmation», которая, очевидно, не присутствует в этой части приложения. Когда я добавил, все работает отлично! Еще раз спасибо! – Loed

0

Это строка, которая приводит к сбою вашего сохранения. Я предполагаю, что у вас есть валидация или какой-либо другой обратный вызов в вашей модели User, которая срабатывает при вызове @ user.update_attributes. Ошибка проверки/обратного вызова, что приводит к сбою сохранения.

+3

Какая линия? Вы на самом деле не показали один ... – anaximander

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

  • Нет связанных вопросов^_^