2010-09-03 4 views

Répondre

4

Je pense que la méthode after_sign_in_path_for en est ce que vous Concevoir cherchez.

Définissez cette méthode dans votre ApplicationController et elle devancera l'implémentation par défaut de Devise. C'est ce que la documentation spécifie à faire.

Détails ici: http://rdoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

+0

J'ai oublié de mentionner dans Devise 1.0, pas 1.1. – Pablo

+0

after_sign_in_path_for n'est pas appelé du tout sur la version 1.0.8. – Pablo

+0

En regardant le SessionsController de Devise, lorsque la connexion est réussie, on appelle sign_in_and_redirect. Cela redirige vers l'emplacement précédent stocké dans la session. Si aucun emplacement n'est stocké, after_sign_in_path_for est appelé. L'utilisateur se connecte-t-il depuis (ou via) la page d'accueil? Cela pourrait expliquer pourquoi il redirige toujours là-bas. – Sidane

21

Les chances sont que votre utilisateur est redirigé avant after_sign_in_path est appelé. Cela se produit si l'utilisateur essaie d'accéder directement à une page protégée par l'authentification. Cela arrivera tout le temps si vous avez votre root_path ('/') protégé par l'authentification.

Il y a une discussion sur les groupes Google sur ce sujet:

La solution rapide et sale est d'écraser stored_location_for toujours revenir nil comme ceci:

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

En légère différence, je ne renverrai que nil de l'emplacement_localisé_for s'il correspond à '/' qui est ma route par défaut. De cette façon, ils iront à after_sign_in_path seulement s'ils n'essaient pas explicitement d'aller ailleurs. Pour ce faire, remplacez simplement nil par "(location = super) == '/'? Nil: location". –

0

Supposons que vous souhaitiez afficher le tableau de bord de l'utilisateur après la connexion.

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 

dans routes.rb:

root :to => 'homes#index' 

Si connecté, si bloc est entré en action d'index et dashboard.erb est rendu. (assurez-vous d'initialiser toutes les variables, requises par dashboard.erb, dans votre if-block) Sinon rails rend index.erb

Questions connexes