2012-04-23 11 views
6

Voglio utilizzare Devise con due spazi dei nomi: uno spazio dei nomi API e lo spazio dei nomi predefinito, ma i due sembrano essere in conflitto quando un utente tenta di accedere. Significato, qualsiasi lo spazio dei nomi che fa riferimento a Devise per primo finisce con come destinazione finale di reindirizzamento. Es: Se provo a creare una nuova sessione sotto lo spazio dei nomi predefinito, fallirà su quel percorso di sessione utente, e quindi tenterò di creare la sessione sul percorso delle sessioni API/v1.Uso di Devise con più spazi dei nomi per lo stesso modello

Come faccio a fare in modo che i due agiscano in modo indipendente?

Entrambi fanno riferimento a un oggetto Utente. Il controller user_sessions per lo spazio dei nomi predefinito è 'user_sessions'. L'user_sessions controller per l'API/V1 spazio dei nomi è '/ 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 

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

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

API NAMESPACE USER_SESSIONS_CONTROLLER - --- (questo va a mio controller Devise personalizzato di base marcato sotto)

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

---- API spazio dei nomi personalizzato DEVISE base controller ----

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

risposta

6

ho scoperto che questo non è possibile con Devise, è necessario disporre di un segno-in/uscire fonte.

Soluzione pulita: crea percorsi per gli spazi dei nomi API e Web che puntano allo stesso codice del controller Devise (ad esempio,/utente/sessioni). Qui, chiamate partial per la risposta appropriata (JSON, HTML). Questi partial possono essere posti nelle directory view di ogni namespace, mantenendo le cose pulite.

2

È necessario definire due ruoli diversi per utente come amministratore e utente finale.

e quindi definire questi percorsi per lui

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 

E poi amministratore sarà connettersi da questa url localhost: 3000/admin

E poi end_user sarà connettersi da questa url localhost: 3000/end_user

Per definizione dei ruoli vedono questo

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

Speranza avrete un'idea

+0

Se si guarda il codice che ho postato, ho fatto esattamente questo. Come è diversa la tua proposta di soluzione? – beeudoublez

Problemi correlati