経緯

Webアプリケーションでは往々にして管理画面と公開画面に大きく別れることが多いです。

ただ、「両方とも、productを扱うから!」と単純に全てをapp/controllers/products_controller.rbに記述してしまうと、ファイルが大きくなり、メンテナンシビリティが下がってしまいます。

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

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

ディレクトリの作成

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

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

ApplicationControllerの作成

管理側のコントローラのベースになるapp/controllers/admin/application_controller.rbというファイルを作成し、
以下のように記述しましょう。

class Admin::ApplicationController < ApplicationController
end

クラス名のAdmin::が名前空間になります。後ろの< ApplicationControllerapp/controllers/application_controller.rbに記述されたApplicationControllerを継承させるという意味です。

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

class Public::ApplicationController < ApplicationController
end

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

ProductsController.rbの作成

app/controllers/admin/products_controller.rb

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

  # 後略
end

app/controllers/public/products_controller.rb

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は書き換えを行いません。

まとめ

  • ControllerやViewはディレクトリを分けることでメンテナンスしやすくする
  • scopeやnamespaceを上手く活用して、URLの設計に無駄をなくす