2012-12-12 12 views
28

Verwenden von Devise zum Verwalten von Benutzersitzungen/-registrierungen Ich müsste bestimmte Aufgaben ausführen (z. B. die Aktualisierung einiger Felder in der Benutzertabelle für diesen bestimmten Benutzer), sobald sich ein Benutzer anmeldet und bevor er von der Startseite auf die Startseite umgeleitet wird für verbundene Benutzer.Rails - Wie setze ich den SessionSController auf bestimmte Aufgaben um, wenn der Benutzer sich anmeldet?

Muss ich sessions Controller überschreiben, und wenn ja wie?

Antwort

50

Alternativ können Sie Ihre eigenen Sitzungen Controller

class SessionsController < Devise::SessionsController 
    def new 
    super 
    end 

    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    if !session[:return_to].blank? 
     redirect_to session[:return_to] 
     session[:return_to] = nil 
    else 
     respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
    end 
end 

Und in routes.rb Add erstellen:

devise_for :users, controllers: {sessions: "sessions"} 
+0

Danke! Am Ende habe ich die erste Lösung verwendet, werde dies jedoch für andere ähnliche Anwendungsfälle berücksichtigen. –

+2

Der Code hat sich ein wenig verändert, Link zur Master-Kopie: https://github.com/plataformatec/devise/blob/master/ app/controllers/devise/sessions_controller.rb – Daniel

15

Devise stellt die Callback-Methode after_database_authentication bereit. Sie haben vollen Zugriff auf das aktuell authentifizierte Benutzerobjekt dort.

Wenn Sie den aktuellen Benutzernamen nach jeder erfolgreichen Anmeldung aktualisieren möchten, können Sie das unten tun.

class User < ActiveRecord::Base 
    devise :database_authenticatable 

    def after_database_authentication 
    self.update_attributes(:name => "your name goes here") 
    end 
end 
+0

Vielen Dank, das ist, was ich gesucht habe! –

+0

Kopieren Sie das Beispiel nicht und fügen Sie es ein, weil Soundar ein zweites "def" geschrieben hat, wo er "Ende" hätte schreiben sollen. – heavysixer

+0

@heavysixer Danke, dass Sie auf den Tippfehler hingewiesen haben. Ich habe die Antwort aktualisiert. –

9

Wenn Sie bei Devise's implementation von sessions_controller#create anschauen, werden Sie feststellen, dass sie nachgeben wenn du einen Block passierst.

Also, Unterklasse ihre Sitzungen Controller und übergeben Sie einen Block, wenn Sie Super anrufen. Um das zu tun, sagen erste Devise in routes.rb, dass Sie möchten, dass Ihre eigenen Sitzungen Controller verwenden:

devise_for :users, controllers: { sessions: 'users/sessions' } 

und erstellen Sie eine SessionsController Klasse und einen Block übergeben, wenn Sie Super in Ihrer create-Methode aufrufen. Es würde wie folgt aussehen:

class Users::SessionsController < Devise::SessionsController 
    layout "application" 

    # POST /login 
    def create 
    super do |user| 
     if user.persisted? 
     user.update_attributes(foo: :bar) 
     end 
    end 
    end 
end 

Die meisten der Devise Controller-Methoden einen Block akzeptieren, so könnte man dies für die Registrierung tun, Passwort vergessen, etc auch.

+0

'Fehler: Passwort darf nicht leer sein'. Sieht so aus, als könnten Sie die Attribute einer Devise-geschützten Ressource (z. B. "foo" im Beispiel) nicht aktualisieren, ohne ein Passwort anzugeben? – changingrainbows

+0

Sie könnten versuchen, die Zeile in 'user.update_attributes (foo:: bar) zu ändern, wenn user.persisted?', So dass es nicht ausgeführt wird, wenn die Devise-Speicherlogik fehlgeschlagen ist. –

+0

Nur meine Antwort aktualisiert und 'if user.persisted?' Zur Verdeutlichung hinzugefügt. –

Verwandte Themen