2010-09-03 29 views

Respuesta

4

Creo que el método after_sign_in_path_for en Diseñar es lo que estás buscando.

Defina ese método en su ApplicationController y anulará la implementación predeterminada de Devise. Esto es lo que la documentación especifica que hacer.

Detalles aquí: http://rdoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

+0

Se me olvidó mencionar en Devise 1.0, no 1.1. – Pablo

+0

after_sign_in_path_for no se está llamando en 1.0.8 en absoluto. – Pablo

+0

Observando el SessionsController de Devise, cuando el inicio de sesión es exitoso, se llama a sign_in_and_redirect. Esto redirige a la ubicación anterior almacenada en la sesión. Si no se almacena ninguna ubicación, se llama a after_sign_in_path_for. ¿El usuario está iniciando sesión desde (o desde) la página de inicio? Eso podría explicar por qué siempre redirige allí. – Sidane

21

probable es que su usuario está siendo redirigido antes after_sign_in_path se llama. Esto sucede si el usuario intenta ir directamente a una página que está protegida por autenticación. Esto sucederá todo el tiempo si tiene su root_path ('/') protegido por autenticación.

Hay una discusión sobre los grupos de Google sobre este tema:

La solución rápida y sucia es sobrescribir stored_location_for para siempre volver nil así:

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

Como una ligera variación de esto, solo devuelvo nil de ubicación_de_suministro_para si coincide con '/' que es mi ruta predeterminada. De esa forma irán a after_sign_in_path solo si no intentaran ir a otro lugar explícitamente. Para hacer eso simplemente reemplace nil con "(location = super) == '/'? Nil: location". –

0

Supongamos que desea mostrar el tablero del usuario después de iniciar sesión.

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 

en routes.rb:

root :to => 'homes#index' 

Si ha iniciado sesión, si-bloque se introduce en la acción índice y dashboard.erb se representa. (asegúrese de inicializar todas las variables, requeridas por dashboard.erb, en su bloque if) De lo contrario rieles representa index.erb

Cuestiones relacionadas