[Rails] 管理画面と公開画面を分けてシステムを作る方法【初心者向け】

経緯

Webアプリケーションでは往々にして管理者向け画面とユーザー向けの画面に大きく別れることがよくあります。

ただ、「両方とも、productを扱うから!」と管理者画面もユーザー画面もapp/controllers/products_controller.rbに記述してしまうと、ファイルが大きくなり、管理しづらくなってしまいます。

また、公開側のURLは/productsのようにしながら、ディレクトリはapp/controllers/public/以下に格納できるようにします。

そこで、今日は以下の様な設定の方法を紹介します。

  • 管理画面は/admin/productsのようなパスでアクセスできる
  • 公開画面は/productsのようなパスでアクセスできる
  • 管理側のコントローラと公開側のコントローラはディレクトリを分ける

ディレクトリの作成

今回、作成するコントローラは管理側をapp/controllers/admin、公開側をapp/controllers/publicというパスに保存していきます。

これらのディレクトリを何はともあれ、作成しましょう。

ApplicationControllerの作成

管理側のControllerのベースになるapp/controllers/admin/application_controller.rbというファイルを作成し、

以下のように記述しましょう。

class Admin::ApplicationController < ApplicationController
end

クラス名のAdmin::名前空間と呼ばれるもので、ものすごく簡単に言うと複数のクラスを一纏めにできるものです。

後ろの< ApplicationControllerapp/controllers/application_controller.rbに記述されたApplicationControllerを継承させるという意味です。

同様に公開側のControllerのベースになるapp/controllers/public/application_controller.rbも以下のように作成します。

class Public::ApplicationController < ApplicationController
end

このように名前空間を分けたApplicationControllerを用意することで、管理側共通の処理や、公開側共通の処理を書く場所を作ることができました。

ProductsController.rbの作成

class Admin::ProductsController < Admin::ApplicationController
  before_action :set_product
  def index
    @products = Product.all
  end
  # 後略
end
class Public::ProductsController < Public::ApplicationController
  before_action :set_product
  def index
    @products = Product.all
  end
  # 後略
end

ちなみに、ビューファイルはapp/views/admin/products, app/views/public/productsに配置します。

Routingの設定

routes.rbを設定していきます。

# 前略
namespace :admin do
  resources :products # => /admin/products etc
end
scope module: :public do
  resources :products # => /products
end
# 後略

namespaceを使うことによって、使用するコントローラの指定、およびURLの書き換えを行っています。
scope module: :publicは使用するコントローラの名前空間のみを書き換え、URLは書き換えを行いません。

まとめ

普通に作るのであれば、

  • app/controllers/products_controller.rb
  • app/controllers/admin/products_controller.rb

の二種類のControllerを作ることになると思いますが、このように実装することで、管理画面と公開画面がディレクトリごと切り分けられるので、管理しやすくなります。

namespaceやscopeを活用して、メンテナンスしやすいシステムを構築するように工夫しましょう!