2011-02-10 16 views
65

estoy usando el siguiente código para mis rutas:Configuración Diseñar inicio de sesión sean página raíz

devise_for :user, 
    :as => '', 
    :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
    } 

Pero cuando estoy conectado a cabo y yo Goto /logout me sale el siguiente error:

No route matches {:action=>"new", :controller=>"devise/sessions"}

¿Cómo configuro la ruta raíz para que sea :sign_in acción?

Respuesta

99

Para una continuación de las personas que están preguntando por el error Could not find devise mapping for path "/" hay una solución.

Usted encontrará que hay una pista en sus registros que probablemente va a decir:

[Devise] Could not find devise mapping for path "/". 
This may happen for two reasons: 

1) You forgot to wrap your route inside the scope block. For example: 

    devise_scope :user do 
    match "/some/route" => "some_devise_controller" 
    end 

2) You are testing a Devise controller bypassing the router. 
    If so, you can explicitly tell Devise which mapping to use: 

    @request.env["devise.mapping"] = Devise.mappings[:user] 

Así que vuelve a intentar el enfoque pero en lugar de envolverlo (como @miccet suggets) dentro de un bloque alcance:

devise_scope :user do 
    root to: "devise/sessions#new" 
end 

esto funcionó bien para mí

+3

Esto me envió a un bucle infinito, querido lector quien tiene el mismo problema, el siguiente paso de la respuesta está aquí http://stackoverflow.com/questions/19855866/how-to-set-devise-sign-in-page-as-root-page-in-rails – Jngai1297

3

Supongo que tiene diferentes roles de usuario. Si usted tiene que agregar un ámbito como éste a los usuarios de recursos:

devise_scope :user do 
    get "/logout" => "devise/sessions#destroy" 
    end 

Puede leer más sobre anulando diseñar rutas aquí: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

+0

No es tanto que no puedo acceder a la ruta de cierre de sesión. Cuando se desconecta, la ruta de cierre de sesión lo redirige a la raíz. –

23
root :to => "devise/sessions#new" 

que necesitaba para establecer la raíz de inicio por defecto . Me sentí como si hubiera intentado esto toda la noche de anoche (antes de publicar la pregunta), pero está funcionando ahora. Si está desconectado, Devise intenta redirigirlo a la ruta raíz que no había definido.

+13

CUALQUIER IDEA ¿POR QUÉ CONSIGO ESTO? No se pudo encontrar el mapeo de diseño para la ruta "/". ¿Tal vez se olvidó de envolver su ruta dentro del bloque de alcance? – baash05

+0

Existe una solución a este error "no se pudo encontrar el mapeo de diseño" que, en aras de la claridad, la publiqué en una respuesta separada en esta página: http://stackoverflow.com/a/12994856/400790 –

+0

la respuesta es justo debajo ... – Nithin

13

(Este fue publicada como un suggested edit, pero debería haber sido una respuesta de su propia No sé si tiene sentido o no editor anónimo Estimado:.. No dude en volver a publicar esta respuesta como su propio, y déjame un comentario por lo que voy a borrar esta copia.)

root :to => redirect("https://stackoverflow.com/users/login") 
+3

Tenga en cuenta que esta ruta es una redirección. No muestra la página de inicio de sesión en la URL raíz. Para ello, es necesario crear la ruta devise_scope: usuario hacer raíz: a => "diseñar/sesiones # nueva" finales según lo sugerido por @PeterNixey – Robert

72
devise_for :users 

devise_scope :user do 
    authenticated :user do 
    root 'home#index', as: :authenticated_root 
    end 

    unauthenticated do 
    root 'devise/sessions#new', as: :unauthenticated_root 
    end 
end 

Al igual que este, probado en 4.1 Carriles Carriles .0.rc1.

+1

Sospecho que todo depende de la versión de Rails y Devise. Esto ciertamente funciona para Rails 4 con Devise 3 - la mayoría de las otras respuestas no. –

+0

Creo que esta es la mejor manera de hacerlo. Funciona con Rails 4.2.7.1 y Devise 4.2.0 – luislezcair

+0

¡Genial! Me gusta este código Gracias. – Penguin

0

Usando carriles de 3,2 y legado 3.2.3 me las arreglo para configurar mi página de inicio "casa # índice de" (controlador de la acción #) como la página de inicio de sesión haciendo los siguientes cambios.

# 1 Agregado el formulario de acceso a la página principal:

<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> 
    <%= f.input :email %> 
    <%= f.input :password %> 
    <%= f.button :submit %> 
<% end %> 

# 2 métodos Añadido resource_name, recursos y devise_mapping a app/heldpers/application_helper.rb:

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
end 

# 3 Creado un controlador de sesiones personalizadas app/controllers/usuarios/sessions_controller.rb:

class Users::SessionsController < Devise::SessionsController 

    protected 

    # This method tell sessions#create method to redirect to home#index when login fails. 
    def auth_options 
     { scope: resource_name, recall: 'home#index' } 
    end 

end 

# 4 Saltar las rutas de sesión y la configuración de la costumbre controlador de sesiones en config/routes.rb:

devise_for :users, path: 'auth', skip: [:sessions], 
      controllers: { 
       sessions: 'users/sessions' 
      } 

as :user do 
    get 'auth/sign_in' => 'home#index', as: :new_user_session 
    post 'auth/sign_in' => 'users/sessions#create', as: :user_session 
    delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session 
end 
9

Tengo esto para trabajar con la respuesta @VvDPzZ. Pero tuve que modificarlo ligeramente

devise_scope :business_owner do 
    authenticated do 
     root to: 'pages#dashboard' 
    end 

    unauthenticated do 
     root to: 'devise/sessions#new', as: 'unauthenticated_root' 
    end 
    end 

que tenía al anuncio to: en la declaración de la ruta raíz. También eliminé el as: :authenticated_root porque ya tenía algunos lugares en mi aplicación haciendo referencia a root_path en los enlaces. Al omitir la parte as: :authenticated_root, no tuve que cambiar ninguno de mis enlaces existentes.

0

Algunas de estas soluciones son demasiado complejas. Solo usa tus habilidades de Rails para abofetear a Devise upside the head:

Agrega 'get' 'users/root', to: 'users#root' a config/routes.rb.

En UsersController hacer algo como:

def root 
    if user_signed_in? 
    redirect_to root_for_signed_in_user_path (or whatever) 
    else 
    redirect_to new_user_session_path 
    end 
end 
Cuestiones relacionadas