0

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).

+0

In den Protokollen wird bearbeiten aufgerufen wird. Bitte poste diesen Code. –

+0

@PauloAbreu hinzugefügt – Utopia025

+0

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. –

Antwort

0

update_attribute aktualisiert den Datensatz nur, wenn alle Validierungen bestanden wurden. Prüfen user.errors

Um die Bypass-Validierung Verwendung:

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