【Rails】Deviseを使って管理側のログインURLをスマートにする

はじめに

Webサービスを開発していて、ハマったところなのでメモ。

環境

前提条件

  1. ローカル環境でDeviseが正常に動作すること。
  2. ApplicationControllerを管理画面用のコントローラーを使っている。
  3. 管理者テーブルは「admin_users」という名前で定義している。

上記内容は、各アプリごとに違うので適度読み替えてください。

詳細

app/controller/admin/admin_controller.rb

class Admin::AdminController < ApplicationController
  layout "admin/layouts/application"
   
  before_action :authenticate_admin_admin_user!
end

config/routes.rb

# home/indexはダッシュボードみたいなところとして定義している。
namespace :admin do
  get '/', :to => 'home#index'
  # controllersは独自でカスタマイズしているため、明示的に書いている。
  devise_for :admin_users, controllers: { sessions: 'admin/devise/sessions', registrations: 'admin/devise/registrations', passwords: 'admin/devise/passwords' }
end

rake routesでパスを確認すると以下の通りとなる。

        new_admin_admin_user_session GET    (/:locale)/admin/admin_users/sign_in(.:format)           admin/devise/sessions#new
            admin_admin_user_session POST   (/:locale)/admin/admin_users/sign_in(.:format)           admin/devise/sessions#create
    destroy_admin_admin_user_session DELETE (/:locale)/admin/admin_users/sign_out(.:format)          admin/devise/sessions#destroy

改修した経緯

  1. URLがまったくスマートではなく、モデル名が露出していたため。
  2. adminが2つ並んでいて、よろしくない。

解決策

以下のように記述すれば、スマートになります。

config/routes.rb

# home/indexはダッシュボードみたいなところとして定義している。
namespace :admin do
  get '/', :to => 'home#index'
end
# controllersは独自でカスタマイズしているため、明示的に書いている。
devise_for :admin_users, path: :admin, controllers: { sessions: 'admin/devise/sessions', registrations: 'admin/devise/registrations', passwords: 'admin/devise/passwords' }

app/controller/admin/admin_controller.rb

class Admin::AdminController < ApplicationController
  layout "admin/layouts/application"
   
  before_action :authenticate_admin_user!
end

rake routesでパスを確認すると以下の通りとなる。

        new_admin_user_session GET    (/:locale)/admin/sign_in(.:format)                       admin/devise/sessions#new
            admin_user_session POST   (/:locale)/admin/sign_in(.:format)                       admin/devise/sessions#create
    destroy_admin_user_session DELETE (/:locale)/admin/sign_out(.:format)                      admin/devise/sessions#destroy

参考

github.com