0

Это самая странная вещь, но я создаю функциональность сброса пароля в свое приложение и сталкиваюсь с проблемой, которая просто не складывается. Ниже методы действий контроллера и класса, которые в настоящее время называют: действиеUpdate_attribute не работает в производстве

контроллера, чтобы создать ссылку для сброса пароля:

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 

метод пользователя, который работает в разработчике, но не подталкивать

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 

As отметил, что все работает на 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 (который использует почти идентичный подход).

+0

В журналах, редактирования вызывается. пожалуйста, напишите этот код. –

+0

@PauloAbreu добавлено – Utopia025

+0

Заменить [email protected]_at.nil? с @ user.active ?, гораздо проще читать и менее подвержены ошибкам. Также вы отправляете 2 разных версии valid_user. Что такое '@ user.authenticated? (: Reset, params [: id])? Valid_user останавливает действие редактирования, поэтому что-то не так. добавьте некоторые logger.info или logger.error, чтобы отслеживать весь путь в процессе производства. –

ответ

0

update_attribute обновляет запись только после прохождения всех проверок. Проверить user.errors

Для использования проверки шунтирования:

user.update_column(:reset_sent_at, Time.zone.now)