2012-04-23 13 views
6

Chcę użyć narzędzia Devise z dwoma przestrzeniami nazw: przestrzeni nazw interfejsu API oraz domyślnej przestrzeni nazw, , ale wydaje się, że oba te elementy są w konflikcie, gdy użytkownik próbuje się zalogować. Znaczenie, w zależności od tego, przestrzeń nazw, która odwołuje się do Devise, ostatecznie kończy się jako ostateczne miejsce przekierowania. Przykład: jeśli spróbuję utworzyć nową sesję w domyślnym obszarze nazw, zakończy się niepowodzeniem na ścieżce sesji użytkownika, , a następnie spróbuje utworzyć sesję w ścieżce sesji API/v1.Korzystanie z narzędzia Devise z wieloma przestrzeniami nazw dla tego samego modelu

Jak sprawić, by te dwie osoby działały niezależnie?

Obaj odnoszą się do obiektu użytkownika. Kontrolerem user_sessions dla domyślnego obszaru nazw jest "user_sessions". User_sessions kontroler dla API/nazw V1 jest '/ 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 

----- domyślnej przestrzeni nazw USER_SESSIONS_CONTROLLER -----

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

API NAMESPACE USER_SESSIONS_CONTROLLER - --- (to idzie do mojego kontrolera zwyczaj opracować bazowej oznaczonego poniżej)

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

---- API namespace cUSTOM opracować centralnej sterownika ----

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

Odpowiedz

6

I okazało się, że nie jest to możliwe z opracowania, trzeba mieć jeden znak w/wylogowaniu źródło.

Czyste rozwiązanie: Utwórz trasy dla interfejsów API i Web, które wskazują na ten sam kod kontrolera Devise (np./User/sessions). Tam wywołaj części dla odpowiedniej odpowiedzi (JSON, HTML). Te części mogą siedzieć w katalogach widoków dla każdej przestrzeni nazw, utrzymując rzeczy w czystości.

2

Powinieneś zdefiniować dwie różne role dla użytkownika takiego jak administrator i użytkownik końcowy.

a następnie zdefiniować te trasy dla niego

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 

A potem admin logowania z tej url localhost: 3000/admin

A potem end_user będzie zalogować się z tym adresem localhost: 3000/end_user

Dla zdefiniowania ról zobaczyć

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

Nadzieję dostaniesz pomysł

+0

Jeśli spojrzysz na kod, który napisałem, zrobiłem dokładnie to. W jaki sposób proponowane przez ciebie rozwiązanie jest inne? – beeudoublez

Powiązane problemy