将Devise与多个名称空间用于同一个Model

我想使用具有两个名称空间的Devise:API名称空间和默认名称空间,但是当用户尝试登录时,这两个名称似乎是冲突的。意思是,引用Devise的任何名称空间最终都是最终的重定向位置。 例如:如果我尝试在默认命名空间下创建新会话,它将在该用户会话路径上失败,然后尝试在API / v1会话路径上创建会话。

如何让两者独立行动?

它们都引用了User对象。 默认命名空间的user_sessions控制器是“user_sessions”。 API / V1命名空间的user_sessions控制器是’/ 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 —-(这是我在下面标注的自定义Devise基本控制器)

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

—- API NAMESPACE CUSTOM DEVISE BASE控制器—-

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

我发现使用Devise是不可能的,你必须有一个登录/注销源。

清洁解决方案:为API和Web命名空间创建指向相同Devise控制器代码(例如/ user / sessions)的路由。 在那里,调用partials以获得适当的响应(JSON,HTML)。 这些部分可以位于每个命名空间的视图目录中,保持干净。

您应该为管理员和最终用户等用户定义两个不同的角色。

然后为他定义这些路线

  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 

然后管理员将从此url localhost:3000 / admin登录

然后end_user将从此url localhost:3000 / end_user登录

对于定义角色,请参阅此

Rails:使用可以查看所有用户的设备添加管理员角色

希望你会明白