web-dev-qa-db-ja.com

名前空間内で工夫する

私はRailsプロジェクトを通常のユーザーのフロントエンドと管理者のバックエンドで分割しようとしています。そのため、管理者を簡単に制御できるように、名前空間「admin」を作成しましたマップ管理者の特定のコントローラメソッド/レイアウト/認証。

Deviseを使用して、管理者のみを登録/認証しています。これは管理者のみに使用されるため、私はDeviseを管理ネームスペースに移動しようとしています。

Deviseの documentation で探していたものを正確に見つけることができませんでしたが、routes.rbで次のようなことを試しました:

namespace 'admin'do 
  devise_for :admins
end

また、カスタムのDevise :: Sessionsコントローラーを作成しようとしましたが、それもうまくいかなかったようです。

誰でもこれを行う方法を知っていますか?カスタム(管理者)レイアウトでdeviseに通常のルートを使用する必要がありますか?

38
Harm de Wit

単にDeviseを管理ネームスペースに「移動」するのは間違っています。 DeviseはDevise::SessionsControllerのようなコントローラを使用しており、「移動」することはできません。

私は通常、独自のコントローラーを作成し、それらをDeviseから継承します。

class Admin::SessionsController < ::Devise::SessionsController
  layout "admin"
  # the rest is inherited, so it should work
end

そして、これをconfig/routes.rbで構成します。

devise_for :admins, :controllers => { :sessions => "admin/sessions" }

Orレイアウトをもう少し複雑にすることで、レイアウトのみを変更できます。

class ApplicationController < ActionController::Base

  layout :layout

  private

  def layout
    if devise_controller? && devise_mapping.name == :admin
      "admin"
    else
      "application"
    end
  end

end
41
iain

devise_forメソッドをスコープに移動するだけです。

scope '/admin' do
  devise_for :admins
end

名前空間を使用すると、コントローラーは存在しないAdmin::SessionControllerを探します。スコープでは機能しないので、それでうまくいくはずです。

25
Jack Chu

取るパスを工夫して指定し、名前空間の外側に配置します。

devise_for :users, path: 'admins'

これにより、次のルートが生成されます

new_user_session          GET      /admins/sign_in(.:format)          devise/sessions#new
user_session              POST     /admins/sign_in(.:format)          devise/sessions#create
destroy_user_session      DELETE   /admins/sign_out(.:format)         devise/sessions#destroy
user_password             POST     /admins/password(.:format)         passwords#create
new_user_password         GET      /admins/password/new(.:format)     passwords#new
edit_user_password        GET      /admins/password/edit(.:format)    passwords#edit
                          PUT      /admins/password(.:format)         passwords#update
cancel_user_registration  GET      /admins/cancel(.:format)           registrations#cancel
user_registration         POST     /admins(.:format)                  registrations#create
new_user_registration     GET      /admins/sign_up(.:format)          registrations#new
edit_user_registration    GET      /admins/edit(.:format)             registrations#edit
                          PUT      /admins(.:format)                  registrations#updat
                          DELETE   /admins(.:format)                  registrations#destroy

これがあなたが探しているものであれば、その場合は何も変更する必要はありません。

ハッピーコーディング:)

14
Ronak Jain

Jack Chiain の両方のソリューションで問題を解決し、ログインフォームのレイアウトをカスタマイズするためにビューを生成する必要があります。

だからあなたのconfig/routes.rbには

scope '/subfolder' do
   devise_for :admins, :controllers => { :sessions => "subfolder/sessions" }
end

namespace :subfolder do
  match '/', :to => 'subcontroller#action'
end

すでに行っているように、セッション用に独自のコントローラーを作成することを忘れないでください。おそらく、Rails generate devise:viewsを使用してビューも生成する必要があります

これをチェックしてください 工夫タスクに疑問がある場合。

5
Saldan

Deviseビューをviews/admin/admins /に、コントローラーをcontrollers/admin/admins /に置きたい場合:

controllers/admin/adminsにあるsessions_controller.rb:

class Admin::Admins::SessionsController < ::Devise::SessionsController
  layout "admin/connection"
end

routes.rb:

namespace :admin do |admin|
    devise_for :admins, :controllers => { :sessions => "admin/admins/sessions" }
end

デバイスビューの生成:

Rails g devise:views admin/admins
1
Guabi Delabatte

Iainの回答の最初のソリューションに加えて、私はdeviseのビューを生成する必要がありました。

でビューを生成する

Rails g devise_views

ビューは、views> deviseに配置されます。作成したマップ「セッション」をマップビュー>管理者に移動します

0
Harm de Wit