RailsのNamespaced ControllerとAdmin構成を完全解説!初心者でもわかるルート・認可・レイアウトの分離
生徒
「Railsで管理画面ってどうやって作るんですか?普通の画面と分けたいです。」
先生
「その場合は、Namespaced Controllerと呼ばれる仕組みを使うのが一般的ですよ。管理者専用のルーティングや画面を分けることができます。」
生徒
「難しそうですが、初心者でも理解できますか?」
先生
「もちろんです!ルートの分け方・認可処理・レイアウトの切り替えなど、一つずつ丁寧に解説していきますね。」
1. Namespaced Controller(ネームスペース付きコントローラ)とは?
Namespaced Controller(ネームスペース付きコントローラ)とは、コントローラをディレクトリで分類して役割を明確に分けるRailsの仕組みです。特に管理画面(Admin)と通常ユーザー画面を分けたいときに使われます。
たとえば、ブログ記事を管理する画面を作りたい場合、次のようにします。
# app/controllers/admin/posts_controller.rb
class Admin::PostsController < ApplicationController
def index
@posts = Post.all
end
end
Admin::PostsControllerという名前にすることで、Railsは自動的にadminディレクトリにあるposts_controller.rbを探します。
2. ルーティングで管理画面を分ける方法
ルーティングもネームスペースで分ける必要があります。namespaceというキーワードを使って設定します。
# config/routes.rb
Rails.application.routes.draw do
namespace :admin do
resources :posts
end
end
これにより、URLは/admin/postsのようになります。一般ユーザーとは別のURL空間(パス)になるので、管理者専用のページと簡単に区別できます。
3. 認可処理で管理者だけアクセスできるようにする
次に、認可(にんか)の設定です。これは「誰がアクセスできるのか?」を制限する処理です。
たとえば、before_actionを使って、管理者だけがアクセスできるようにします。
# app/controllers/admin/base_controller.rb
class Admin::BaseController < ApplicationController
before_action :require_admin
private
def require_admin
unless current_user&.admin?
redirect_to root_path, alert: '管理者専用のページです'
end
end
end
このAdmin::BaseControllerを作っておくことで、他のAdmin::◯◯Controllerはそれを継承するだけで、簡単に共通の認可処理を入れることができます。
# app/controllers/admin/posts_controller.rb
class Admin::PostsController < Admin::BaseController
def index
@posts = Post.all
end
end
4. 管理画面専用のレイアウトを使う方法
管理画面は見た目(デザイン)も通常画面と分けたいですよね。その場合は、レイアウトを切り替えることができます。
Railsではlayoutメソッドを使って、表示に使うHTMLテンプレート(レイアウト)を指定できます。
# app/controllers/admin/base_controller.rb
class Admin::BaseController < ApplicationController
layout 'admin'
end
上記のようにすれば、app/views/layouts/admin.html.erbという専用レイアウトファイルを使って、管理画面だけ別のデザインにできます。
<!-- app/views/layouts/admin.html.erb -->
<!DOCTYPE html>
<html>
<head>
<title>管理画面</title>
</head>
<body>
<h1>管理者用メニュー</h1>
<%= yield %>
</body>
</html>
5. 管理画面と通常画面を分離するメリット
ここまでで、管理画面を分離する方法を学びましたが、なぜ分けるべきなのでしょうか?
- URLが分かれているため、セキュリティ対策がしやすい
- レイアウトが別なのでデザイン変更が簡単
- 認可処理を共通化できるため、コードが綺麗
- 運用や保守がしやすくなる
このように、Namespaced ControllerとAdmin構成を使えば、機能・デザイン・セキュリティをしっかり分けた構成が可能になります。