Wenn ich in Devise das Kennwort des Benutzers ändere und es in der Datenbank aktualisiert wird, meldet die Site den Benutzer sofort ab. Ich will dieses Verhalten nicht - wie mache ich das? Bitte helfen Sie.
ruby-on-rails
Anand
quelle
quelle
Antworten:
Ich hatte das gleiche Problem und der folgende Code scheint für mich zu funktionieren.
Angenommen, der Kennwortcontroller ist für eine Singleton-Route festgelegt. Angenommen, das authentifizierte Modell ist ein Konto. Damit haben Sie folgendes:
def update if current_account.update_with_password(params[:account]) sign_in(current_account, :bypass => true) flash[:notice] = 'Password updated.' redirect_to account_path else render :action => :show end end
Der Hauptbestandteil ist der Methodenaufruf sign_in, mit dem versucht wird, das Konto erneut anzumelden, die Rückrufe des Direktors jedoch umgangen und das Konto in der Sitzung gespeichert werden.
quelle
sign_out
über dem hinzufügen müssensign_in
, erfassen Sie zuerst das Modell in einer Instanzvariablen, damit Sie es über diesign_in
Methode übergeben können, andernfalls übergeben Sie esnil
.current_user.update_with_password(bleh)
zurückkehren,false
fehlt Ihnen wahrscheinlich wie ich das aktuelle Kennwort in den Parametern. Überprüfen Sie die QuelleDas obige Beispiel hat bei der Verwendung mehrerer Bereiche in Devise nicht funktioniert.
Ich musste den Bereichs- / Ressourcennamen in den Pfad sign_in einfügen, damit er funktioniert, und um Chaos zu vermeiden, musste ich auch den alten Benutzer abmelden, sonst würde jede Art von Verwirrung im Überfluss vorhanden sein.
Die Änderungen, die ich vornehmen musste, würden anhand des obigen Beispiels ungefähr so aussehen.
def update if current_account.update_with_password(params[:account]) sign_out(current_account) sign_in(:account, current_account, :bypass => true) flash[:notice] = 'Password updated.' redirect_to account_path else render :action => :show end end
Bearbeiten, um hinzuzufügen: Ich glaube, ich musste den Benutzer zwangsweise abmelden, weil ich irgendwo den Code von Devise überschrieben habe, damit sich Benutzer bei bestimmten Aktionen nicht abmelden. Im Nachhinein; keine gute Idee! Dieser Ansatz ist viel besser! Es ist sicherer, eigene Controller zu erstellen, als den Code von Devise zu überschreiben, es sei denn, dies ist absolut unvermeidbar.
quelle
sign_out current_user
, aber brauchtesign_in :user, @user, bypass: true
.Verwenden Sie diesen Code, um eine Abmeldung zu vermeiden.
sign_in(current_user, :bypass => true)
quelle
Sie können einfach
sign_in_after_reset_password
in Ihrem einstellendevise.rb
config.sign_in_after_reset_password = true
quelle
Update zu Bill Eisenhauer Antwort oben-
sign_in(current_account, :bypass => true)
wurdebypass_sign_in current_account
stattdessen veraltet verwendetWeitere Details finden Sie hier http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#bypass_sign_in-instance_method
quelle
Fügen Sie Ihrer Methode, mit der Sie das Kennwort des Benutzers aktualisieren, unmittelbar nach dem Aktualisieren des Kennworts des Benutzers in der Datenbank den folgenden Code hinzu:
def update . . . . .<your code> . . . . .<your code> sign_in(@user, :bypass => true) . . . . .<your code> . . . . .<your code> end
quelle
Aus einigen Gründen
current_user
ist nicht gleich@user
obwohlcurrent_user.id
gleich@user.id
. Also muss ich verwendensign_in(@user, :bypass => true)
.quelle
user.reload
Bitte beziehen Sie sich hier auf diese Antwort. Ich habe alle oben genannten Antworten ausprobiert. Es funktioniert nicht, wenn der Bereich nicht hinzugefügt wird. https://stackoverflow.com/a/30418266/4973585
Das funktioniert nicht -
sign_in @user, bypass: true
Das funktioniert -
sign_in :user, @user, bypass: true
quelle
Verwenden Sie das registrierbare Modul, mit dem Sie Benutzerfunktionen sowohl registrieren als auch bearbeiten können
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password
quelle