2012-01-17 12 views
8

Estoy usando Rails 3 y Devise para crear una aplicación donde los usuarios lleguen al sitio web y se les muestra una página de inicio que contiene un inicio de sesión y un formulario de registro. Esta página tiene su propio controlador ("página de inicio") por lo que es ruta esRails 3 w/Devise: ¿Cómo establecer dos páginas de inicio separadas en función de si el usuario está autenticado o no?

root :to => "homepage#index" 

Quiero mostrar una página de inicio diferente si los usuarios ya están conectados. Esto explicaría que tiene el punto de la raíz a la

root :to => "dashboard#index" 

¿Hay alguna manera de tener una ruta condicional en routes.rb, que me permita verificar si el usuario está autenticado antes de enrutarlos a una de esas páginas?

He intentado utilizar el siguiente código, pero si no estoy conectado, el dispositivo me pide que inicie sesión, por lo que solo funciona la primera ruta.

authenticate :user do 
    root :to => "dashboard#index" 
end 
    root :to => "homepage#index" 

Además, quiero la url para que apunte a www.example.com en ambos casos, por lo que www.example.com/dashboard/index y www.example.com/homepage/index nunca aparecen en el navegador.

¡¡¡Gracias a un millón !!!

Respuesta

13

Prueba de esto, es específico para Alcaide/Idear sin embargo.

root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? } 
root to: "homepage#index" 
+0

Muchas gracias @Bradley, esto me estaba matando :) –

+0

Hago lo mismo, pero tanto el usuario que inició sesión como el que no inició sesión usaron el dashboard # index –

+1

Advertencia: Esto no funciona con Rails 4, se obtiene un error que dice: 'Nombre de la ruta no válida, ya en uso: 'root'' – Happynoff

5

En su HomeController:

def index 
    if !user_signed_in? 
    redirect_to :controller=>'dashboard', :action => 'index' 
    end 
end 
+0

gracias por la respuesta @negarnil. El caso es que probé esta opción, pero no reescribe la url. Quiero que www.example.com apunte a ambas páginas para que nunca se muestre www.example.com/dashboard/index –

+0

Pruebe render: action => 'dashboard.html.erb. http://guides.rubyonrails.org/layouts_and_rendering.html#wrapping-it-up –

2

(misma pregunta exacta respondida aquí: https://stackoverflow.com/a/16233831/930038 Adición de la respuesta aquí también como referencia de los demás..)

En su routes.rb:

authenticated do 
    root :to => 'dashboard#index' 
end 

root :to => 'homepage#index' 

Esto asegurará que root_url para todos autenticados usuarios es dashboard#index

Para su referencia: https://github.com/plataformatec/devise/pull/1147

+0

En Rails 4 esto no funciona. Debe cambiar el nombre de una de las dos Rutas. Ver mi [respuesta] (http://stackoverflow.com/a/19090936/1836143). –

2

Aquí está la respuesta correcta con los carriles 4

root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? }, 
     as: :authenticated_root 
root to: 'homepage#index' 

he tratado de agregar esto a/editar la respuesta aceptada pero es demasiado de una edición para ser aceptado al parecer. De todos modos, votar por la respuesta aceptada (de Bradley), me ayudó a pensar en esto :)

Cuestiones relacionadas