7

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

如何让两者独立行动?

它们都引用了一个用户对象。默认命名空间的 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

----- 默认命名空间 USER_SESSIONS_CONTROLLER -----

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

API NAMESPACE USER_SESSIONS_CONTROLLER ---- (这转到我的自定义设计基本控制器标记如下)

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

---- API 命名空间自定义设计基础控制器 ----

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

2 回答 2

6

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

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

于 2012-11-25T16:51:09.733 回答
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

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

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

要定义角色,请参阅此

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

希望你会有想法

于 2012-04-26T07:22:18.170 回答