7

API名前空間とデフォルトの名前空間の2つの名前空間でDeviseを使用したいのですが、ユーザーがサインインしようとすると、2つが競合しているようです。つまり、Deviseを最初に参照する名前空間が、最終的なリダイレクト場所になります。例:デフォルトの名前空間で新しいセッションを作成しようとすると、そのユーザーセッションパスで失敗し、API/v1セッションパスでセッションを作成しようとします。

2つを独立して動作させるにはどうすればよいですか?

どちらも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

-----デフォルトの名前空間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
4

2 に答える 2

6

Deviseではこれが不可能であることがわかりました。サインイン/サインアウトのソースが1つ必要です。

クリーンなソリューション:同じDeviseコントローラーコード(たとえば、/ user / sessions)を指すAPIとWeb名前空間の両方のルートを作成します。そこで、適切な応答(JSON、HTML)のパーシャルを呼び出します。これらのパーシャルは、各名前空間のビューディレクトリに配置して、物事をクリーンに保つことができます。

于 2012-11-25T16:51:09.733 に答える
1

adminとエンドユーザーのようなユーザーに対して2つの異なる役割を定義する必要があります。

そして、彼のためにこれらのルートを定義します

 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:すべてのユーザーを表示できるdeviseを使用して管理者ロールを追加する

あなたがアイデアを得ることを願っています

于 2012-04-26T07:22:18.170 に答える