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

bee*_*lez 7 namespaces ruby-on-rails devise ruby-on-rails-3

我想使用具有两个名称空间的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
Run Code Online (Sandbox Code Playgroud)

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

class UserSessionsController < Devise::SessionsController
....
end
---- 
Run Code Online (Sandbox Code Playgroud)

API NAMESPACE USER_SESSIONS_CONTROLLER ----(这是我在下面标注的自定义Devise基本控制器)

class Api::V1::UserSessionsController < Api::V1::DeviseBaseController
...
end
Run Code Online (Sandbox Code Playgroud)

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

class Api::V1::DeviseBaseController < Devise::SessionsController
       respond_to :json
end
Run Code Online (Sandbox Code Playgroud)

bee*_*lez 6

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

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