【Rails】Deviseを使って管理側のログインURLをスマートにする
はじめに
Webサービスを開発していて、ハマったところなのでメモ。
環境
- OS X El capitan
- Ruby 2.3.0
- Devise 3.4.1
- Ruby on Rails 4.2.4
前提条件
- ローカル環境でDeviseが正常に動作すること。
- ApplicationControllerを管理画面用のコントローラーを使っている。
- 管理者テーブルは「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
改修した経緯
- URLがまったくスマートではなく、モデル名が露出していたため。
- 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
参考