私はRailsプロジェクトを通常のユーザーのフロントエンドと管理者のバックエンドで分割しようとしています。そのため、管理者を簡単に制御できるように、名前空間「admin」を作成しましたマップ管理者の特定のコントローラメソッド/レイアウト/認証。
Deviseを使用して、管理者のみを登録/認証しています。これは管理者のみに使用されるため、私はDeviseを管理ネームスペースに移動しようとしています。
Deviseの documentation で探していたものを正確に見つけることができませんでしたが、routes.rbで次のようなことを試しました:
namespace 'admin'do
devise_for :admins
end
また、カスタムのDevise :: Sessionsコントローラーを作成しようとしましたが、それもうまくいかなかったようです。
誰でもこれを行う方法を知っていますか?カスタム(管理者)レイアウトでdeviseに通常のルートを使用する必要がありますか?
単に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
devise_for
メソッドをスコープに移動するだけです。
scope '/admin' do
devise_for :admins
end
名前空間を使用すると、コントローラーは存在しないAdmin::SessionController
を探します。スコープでは機能しないので、それでうまくいくはずです。
取るパスを工夫して指定し、名前空間の外側に配置します。
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
これがあなたが探しているものであれば、その場合は何も変更する必要はありません。
ハッピーコーディング:)
Jack Ch と iain の両方のソリューションで問題を解決し、ログインフォームのレイアウトをカスタマイズするためにビューを生成する必要があります。
だからあなたの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
を使用してビューも生成する必要があります
これをチェックしてください 工夫タスクに疑問がある場合。
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
Iainの回答の最初のソリューションに加えて、私はdeviseのビューを生成する必要がありました。
でビューを生成する
Rails g devise_views
ビューは、views> deviseに配置されます。作成したマップ「セッション」をマップビュー>管理者に移動します