2012-04-23 9 views
6

Quiero usar Devise con dos espacios de nombres: un espacio de nombres API y el espacio de nombres predeterminado, pero los dos parecen estar en conflicto cuando un usuario intenta iniciar sesión. Significado, cualquiera que sea El espacio de nombre que hace referencia a Devise primero termina en siendo el lugar de redirección final. Por ejemplo: si intento crear una nueva sesión en el espacio de nombres predeterminado, fallará en la ruta de la sesión de ese usuario, y luego intentaré crear la sesión en la ruta de las sesiones API/v1.Uso de Devise con varios espacios de nombres para el mismo Modelo

¿Cómo hago que los dos actúen de forma independiente?

Ambos hacen referencia a un objeto Usuario. El controlador user_sessions para el espacio de nombre predeterminado es 'user_sessions'. El user_sessions controlador para el API/V1 espacio de nombres es '/ API/V1/user_sessions'

---- ROUTES.RB ------- 
    MySite::Application.routes.draw do 
    namespace :api do 
    namespace :v1 do 
    devise_for :users,:controllers => { :sessions => "api/v1/ 
user_sessions",:registrations=>"users" } 
    ...... 
    end 
end 
devise_for :users,:controllers => { :sessions =>"user_sessions",:registrations=>"users" } do 
    post 'users/sign_in' => 'user_sessions#create', :as => :user_session 
    get 'users/sign_in' => 'user_sessions#new', :as => :new_user_session 
    get 'users/sign_up' => 'user_sessions#new', :as => :new_user_session 
    match 'users/sign_out' => 'user_sessions#destroy', :as => :destroy_user_session 
    <.....> 
end 

----- DEFAULT NAMESPACE USER_SESSIONS_CONTROLLER -----

class UserSessionsController < Devise::SessionsController 
.... 
end 
---- 

API NAMESPACE USER_SESSIONS_CONTROLLER - --- (esto va a mi controlador de base de encargo Diseñar marcado abajo)

class Api::V1::UserSessionsController < Api::V1::DeviseBaseController 
... 
end 

---- API de espacio de nombres personalizado DEVISE base de control ----

class Api::V1::DeviseBaseController < Devise::SessionsController 
     respond_to :json 
end 

Respuesta

6

descubrí que esto no es posible con Idear, usted tiene que tener un inicio de sesión/Cerrar sesión fuente.

Solución limpia: cree rutas para sus espacios de nombres API y Web que apuntan al mismo código de controlador Devise (por ejemplo,/usuario/sesiones). Allí, llame parciales para la respuesta apropiada (JSON, HTML). Esos parciales se pueden sentar en los directorios de vista para cada espacio de nombres, manteniendo las cosas limpias.

2

Debería definir dos roles diferentes para usuario como administrador y usuario final.

y luego definir estas rutas para él

FourtySixLabs::Application.routes.draw do 

    namespace :admin do 
    resources :posts 
    end 

    namespace :end_user do 
     resources :posts 
    end 


    devise_for :users, :controllers => { 
    :sessions => "users/sessions", 
    :confirmation => "users/confirmations", 
    :passwords => "users/passwords", 
    :registrations => "users/registrations", 
    } 


    devise_for :users, as: :user do 
    get 'admin', :to => 'users/sessions#new', :as => :new_user_session 
    get "end_user", :to => "users/sessions#new" 
    get "sign_out", :to => "users/sessions#destroy" 
    end 

end 

Y luego admin iniciar sesión desde esta url localhost: 3000/admin

Y luego end_user será iniciar sesión desde esta url localhost: 3000/end_user

Para definir los roles ver este

Rails : Adding an admin role using devise who can see all the users

Esperanza obtendrá idea

+0

Si miras el código que publiqué, hice exactamente eso. ¿En qué se diferencia la solución propuesta? – beeudoublez

Cuestiones relacionadas