Это самая странная вещь, но я встраиваю функцию сброса пароля в свое приложение и сталкиваюсь с проблемой, которая просто не складывается. Ниже показано вызываемое действие контроллера и методы класса:
Действие контроллера для создания ссылки для сброса пароля:
class PasswordResetsController < ApplicationController
before_action :get_user, only: [:edit, :update]
before_action :valid_user, only: [:edit, :update]
before_action :check_expiration, only: [:edit, :update]
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
if @user && [email protected]_at.nil?
**@user.create_password_reset_digest**
@user.send_password_reset_email
flash[:info] = "message."
redirect_to root_url
else
flash[:danger] = "different message"
redirect_to root_url
end
end
def edit
end
private
## Before Filters ##
def get_user
@user = User.find_by(email: params[:email])
end
# Confirms a valid user
def valid_user
# Unless executes code if conditinal is flase
unless (@user && [email protected]_at.nil? && @user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
end
Пользовательский метод, который работает в dev, но не в prod
def create_password_reset_digest
self.reset_token = User.new_token
**update_attribute(:reset_digest, User.digest(reset_token))**
**update_attribute(:reset_sent_at, Time.zone.now)**
end
Как уже отмечалось, все работает на dev, когда я нажимаю на действующую ссылку электронной почты в prod, я перенаправляюсь на главный экран, я просмотрел журналы heroku, в которых говорилось, что мой before_action не удался:
2016-08-26T19:36:00.208550+00:00 app[web.1]: Started GET "/password_resets/8quvjXgdAKF7fLlWmna0Yg/edit?email=themobio025%40gmail.com" for 98.248.238.131 at 2016-08-26 19:36:00 +0000
2016-08-26T19:36:00.211708+00:00 app[web.1]: Processing by PasswordResetsController#edit as HTML
2016-08-26T19:36:00.211766+00:00 app[web.1]: Parameters: {"email"=>"[email protected]", "id"=>"8quvjXgdAKF7fLlWmna0Yg"}
2016-08-26T19:36:00.214843+00:00 app[web.1]: User Load (1.9ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT 1 [["email", "[email protected]"]]
2016-08-26T19:36:00.218126+00:00 app[web.1]: Redirected to http://qa-themob.herokuapp.com/
2016-08-26T19:36:00.218197+00:00 app[web.1]: Filter chain halted as :valid_user rendered or redirected
Перед действием:
def valid_user
unless (@user && @user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
Затем я попытался копнуть глубже и посмотреть, что происходит, и я открыл сеанс консоли heroku и прошел процесс сброса. Я пришел к выводу, что при отправке электронного письма для сброса пароля ссылка генерировалась, но идентификатор дайджеста сброса пароля не сохранялся для пользователя (с помощью атрибута обновления, выделенного жирным шрифтом выше). Я понятия не имею, почему это не сохраняется в БД, опять же, это работает совершенно нормально в dev, и мой рабочий процесс электронной почты активации работает совершенно нормально в prod и dev (который использует почти идентичный подход).