2010-09-03 10 views

Antwort

4

Ich denke, die after_sign_in_path_for Methode in Devise ist, was Sie suchen zu erwähnen.

Definieren Sie diese Methode in Ihrem ApplicationController und es wird die Standardimplementierung von Devise außer Kraft setzen. Dies ist es, was die Dokumentation vorgibt.

Einzelheiten hier: http://rdoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

+0

Ich habe vergessen, in Devise 1.0, nicht 1.1 zu erwähnen. – Pablo

+0

after_sign_in_path_for wird überhaupt nicht auf 1.0.8 aufgerufen. – Pablo

+0

Mit Blick auf SessionsController von Devise wird sign_in_and_redirect aufgerufen, wenn die Anmeldung erfolgreich ist. Dies leitet zum vorherigen Ort, der in der Sitzung gespeichert ist, um. Wenn kein Ort gespeichert ist, wird after_sign_in_path_for aufgerufen. Loggt sich der Benutzer von (oder über) der Homepage ein? Das könnte erklären, warum es immer dorthin zurückleitet. – Sidane

21

Die Chancen stehen gut, dass Ihr Benutzer umgeleitet wird, bevor after_sign_in_path aufgerufen wird. Dies geschieht, wenn der Benutzer versucht, zu einer Seite zu wechseln, die durch Authentifizierung direkt geschützt ist. Dies passiert die ganze Zeit, wenn Sie Ihre root_path ('/') durch Authentifizierung geschützt haben.

Es gibt eine Diskussion über Google Groups zu diesem Thema:

Die schnelle und schmutzige Lösung ist stored_location_for zu überschreiben immer nil zurückzukehren wie so:

class ApplicationController < ActionController::Base 
... 

    private 
    def stored_location_for(resource_or_scope) 
    nil 
    end 

    def after_sign_in_path_for(resource_or_scope) 
    my_favorite_path 
    end 
end 
+1

Als eine kleine Variation hierüber gebe ich nur nil von stored_location_for zurück, wenn es mit '/' übereinstimmt, was meine Standardroute ist. Auf diese Weise werden sie nur dann nach after_sign_in_path gehen, wenn sie nicht explizit versuchen, woanders hinzugehen. Ersetzen Sie dazu einfach nil durch "(location = super) == '/'? Nil: location". –

0

Angenommen, Sie möchten das Dashboard des Benutzers nach dem Anmelden anzeigen.

class HomesController < ApplicationController  
    def index 
     if current_user //returns nil if not logged in 
      @users = User.all 
      render :dashboard 
     end 
    end 

    def dashboard 
     @users = User.all 
    end 
end 

in routes.rb:

root :to => 'homes#index' 

Wenn angemeldet, if-Block wird in Index Aktion eingegeben und dashboard.erb gemacht wird. (stellen Sie sicher, alle Variablen zu initialisieren, die von demhboard.erb in Ihrem if-Block benötigt werden) Sonst rails rendert index.erb

Verwandte Themen