我想将Devise与两个命名空间一起使用:API命名空间和默认命名空间, 但是当用户尝试登录时,这两者似乎存在冲突。 意思是,任何引用Devise的命名空间最终都会结束 是最后的重定向地方。例如:如果我尝试创建一个新会话 在默认命名空间下,它将在该用户会话路径上失败, 然后尝试在API / v1会话路径上创建会话。
如何让两者独立行动?
它们都引用了User对象。 user_sessions控制器 默认命名空间是' user_sessions'。 user_sessions API / V1命名空间的控制器是' / 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 CONTROLLER ----
class Api::V1::DeviseBaseController < Devise::SessionsController
respond_to :json
end
答案 0 :(得分:6)
我发现使用Devise是不可能的,你必须有一个登录/注销源。
清洁解决方案:为API和Web命名空间创建指向相同Devise控制器代码(例如/ user / sessions)的路由。在那里,调用partials以获得适当的响应(JSON,HTML)。这些部分可以位于每个命名空间的视图目录中,保持清洁。
答案 1 :(得分:1)
您应该为管理员和最终用户等用户定义两个不同的角色。
然后为他定义这些路线
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
然后管理员将从此网址登录 本地主机:3000 /管理员
然后end_user将从此URL登录 本地主机:3000 / end_user
有关定义角色的信息,请参阅
Rails : Adding an admin role using devise who can see all the users
希望你能得到想法