UserSession.find gibt nach dem Ändern des Passwortes nil zurück

Ich habe kürzlich eine Möglichkeit geschaffen, das aktuelle Benutzerpasswort zu ändern, aber nach dem Speichern des Datensatzes gibt meine UserSession.find nil zurück, ich habe versucht, UserSession.new ({...}) zu schreiben, ohne Glück zu speichern, irgendeinen Vorschlag dazu, wie beheben Sie dieses Problem?

Hier ist mein Code, der durch eine AJAX-Anfrage läuft (dies ist eine Methode unter UserSessionController):

def

 change_my_password
    #print "--------------RECORD: #{current_user_session.record.as_json}-------- #{current_user_session.user.as_json}"
    user = current_user
    user_email = user.email
    user_remember_me = user.remember_created_at
    response = {
      :success => false,
      :message_code => Extjs::MessageCodes::ERROR,
      :message => 'Si è verificato un errore',
      :total => 0,
      :root => []
    }
    if user.valid_password?(params[:old_password], true)
      user.password = params[:new_password]
      user.password_confirmation = params[:confirm_password]
      response[:message] = 'La nuova password e la conferma non coincidono o sono troppo brevi'
      if user.save
        response[:success] = true
        response[:message_code] = Extjs::MessageCodes::SUCCESS
        response[:message] = 'Password modificata con successo'
      end
    else
      response[:message] = 'La password precedente non coincide con quella attualmente in uso'
    end

    respond_to do |format|
      format.extjson { render :json => response }
    end
  end
0
hinzugefügt bearbeitet
Ansichten: 1
@ KaiKönig: Sorry, ich habe das nicht verstanden: Zeichne ich meinen User Model Record nicht auf? save gibt tatsächlich true zurück, also sollte es die Daten in der Datenbank ändern (und für die nachfolgende Anmeldung/Abmeldung wird das Passwort tatsächlich geändert). Irgendwelche Vorschläge, wie ich meine Sitzung irgendwie regenerieren kann?
hinzugefügt der Autor Fire-Dragon-DoL, Quelle
@KandadaBoggu: Über 2 AJAX-Anfragen an dieselbe Route (change_my_password). Das erste Mal, wenn ich es anrufe, gibt es den Ser zurück, das zweite Mal gibt es nil zurück: \ (nur wenn ich das Passwort tatsächlich ändere, sonst ist es in Ordnung). Beachten Sie, dass ich den Code aktualisiert habe.
hinzugefügt der Autor Fire-Dragon-DoL, Quelle
Wann gibt UserSession.find nil zurück? In nachfolgenden Anrufen?
hinzugefügt der Autor Harish Shetty, Quelle
record.save gibt nur wahr oder falsch zurück, um anzugeben, ob der Datensatz beibehalten wurde oder nicht. Folglich hält @user_session Ihren neu erstellten Datensatz nicht.
hinzugefügt der Autor krichard, Quelle

2 Antworten

Eigentlich habe ich keine Lösung für dieses Problem gefunden: Ich habe gelöst, indem ich nach dem Ändern des Passworts erneut eine Anmeldung erzwinge (was sogar Sicherheit hinzugefügt wird, also nicht so schlimm).

Ich denke KandadaBoggu hat Recht mit seiner Antwort, aber ich habe alle getestet und sie arbeiten nicht für mich.

Vielleicht ist es ein Problem, das durch etwas Falsches in meinem Code verursacht wurde, ich weiß es wirklich nicht. Im Moment halte ich das nur für die Lösung, weil es tatsächlich für meine Software funktioniert.

Wenn eine bessere Antwort gefunden wird, würde ich es gerne markieren.

Danke an alle.

0
hinzugefügt

Stellen Sie sicher, dass Sie die maintain_sessions Parameter zu false, dh:

acts_as_authentic do |c|
  c.maintain_sessions = false # change this to true.
end

ODER

Aktualisieren Sie die Sitzung manuell nach dem Speichern:

user.send(:update_sessions)

ODER

Erstellen Sie die Sitzung nach dem Speichern erneut:

UserSession.create(user)
0
hinzugefügt
Ich teste sie, aber es scheint, dass sie das Problem nicht lösen: UserSession.create Ich denke, es zerstört meine Sitzung in irgendeiner Weise, in der Tat bekomme ich das nächste Mal, wenn ich es nenne, Benutzer = Nil. user.send (: update_sessions) gleiche Situation und mit maintain_sessions explizit auf wahr (in meiner Konfiguration ist in der Regel nicht gesetzt), Benutzer ist nicht einmal beim ersten Anruf, weiß nicht warum. Ich stelle mir vor, ich bin in einer schlimmen Situation:
hinzugefügt der Autor Fire-Dragon-DoL, Quelle
Auf diese Weise versucht, funktioniert es nicht. Beachten Sie, dass meine erste Anmeldung über AJAX erfolgt, vielleicht kann dies eine Art Problem verursachen?
hinzugefügt der Autor Fire-Dragon-DoL, Quelle
Sehen Sie sich diese Antwort an, um weitere Tipps zu erhalten: stackoverflow.com/a/4075733/163203
hinzugefügt der Autor Harish Shetty, Quelle
Ich glaube nicht, dass es mit AJAX zu tun hat, da AJAX eine reguläre HTTP-Anfrage ist. Sie sollten dies auf der Clientseite debuggen. Versuchen Sie auch, nach reset_password eine reguläre Anfrage zu senden. Drucken Sie das Sitzungsobjekt vor und nach dem Zurücksetzen und im neuen Anruf.
hinzugefügt der Autor Harish Shetty, Quelle