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

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


person Utopia025    schedule 26.08.2016    source источник
comment
В ваших логах вызывается правка. пожалуйста, опубликуйте этот код.   -  person Paulo Abreu    schedule 27.08.2016
comment
@PauloAbreu добавил   -  person Utopia025    schedule 28.08.2016
comment
Заменить [email protected]_at.nil? с @user.active?, намного легче читать и меньше подвержены ошибкам. Также вы публикуете 2 разные версии valid_user. Что делает '@user.authenticated?(:reset, params[:id])'? Valid_user останавливает ваше действие редактирования, поэтому что-то не так. добавьте некоторый logger.info или logger.error, чтобы отслеживать весь путь в производстве.   -  person Paulo Abreu    schedule 28.08.2016
comment
Вы когда-нибудь догадывались об этом? У меня есть миграция, которая буквально просто вызывает update_attribute для каждого объекта модели по мере того, как он проходит через список, и, несмотря на то, что для запуска требуется значительное время, после его запуска похоже, что ни один из атрибутов не был обновлен - и это происходит только в производстве, здесь вообще не воспроизводится.   -  person Trejkaz    schedule 21.11.2016


Ответы (1)


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

Чтобы обойти проверку, используйте:

user.update_column(:reset_sent_at, Time.zone.now)
person vipantonio    schedule 27.12.2017