Dies ist die seltsamste Sache, aber ich baue die Funktion zum Zurücksetzen von Kennwörtern in meine Anwendung aus und stoße auf ein Problem, das einfach nicht aufaddiert. Im Folgenden finden Sie die Controller-Aktion und Klassenmethoden, die aufgerufen werden:Update_Attribute funktioniert nicht in der Produktion
Aktion-Controller einen Passwort-Reset-Link zu erstellen:
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
Benutzer Methode, die in dev funktioniert aber nicht
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
Als prod notiert, alles funktioniert auf dev, wenn ich auf den gültigen E-Mail-Link in prod klicke, werde ich zum Home-Bildschirm umgeleitet, schaute ich auf die Heroku-Protokolle, die meine before_action fehlgeschlagen:
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
Bevor Aktion:
def valid_user
unless (@user && @user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
ich dann versucht, tiefer zu graben und sehen, was los war, und ich öffnete eine Heroku Konsolensitzung auf und ging durch den Reset-Prozess. Ich kam zu dem Ergebnis, dass beim Senden der E-Mail zur Zurücksetzung des Kennworts der Link generiert wurde, die Kennwortzurücksetzung für das Zurücksetzen des Kennworts jedoch nicht für den Benutzer gespeichert wurde (über das Attribut "Fett gedruckte Aktualisierung" oben). Ich habe keine Ahnung, warum dies nicht in der DB gespeichert wird, wieder funktioniert es ganz normal in Dev, und mein Aktivierungs-E-Mail-Workflow funktioniert völlig normal in prod und dev (was einen fast identischen Ansatz verwendet).
In den Protokollen wird bearbeiten aufgerufen wird. Bitte poste diesen Code. –
@PauloAbreu hinzugefügt – Utopia025
Ersetzen Sie [email protected]_at.nil? mit @ user.active?, viel einfacher zu lesen und weniger anfällig für Fehler. Du postest auch 2 verschiedene Versionen von valid_user. Was macht '@ user.authenticated? (: Reset, params [: id])? Valid_user hält Ihre Bearbeitungsaktion an, also stimmt etwas nicht. Fügen Sie logger.info oder logger.error hinzu, um den gesamten Pfad in der Produktion zu verfolgen. –