目次
Webアプリケーションでは往々にして管理者向け画面とユーザー向けの画面に大きく別れることがよくあります。
ただ、「両方とも、productを扱うから!」と管理者画面もユーザー画面もapp/controllers/products_controller.rbに記述してしまうと、ファイルが大きくなり、管理しづらくなってしまいます。
また、公開側のURLは/productsのようにしながら、ディレクトリはapp/controllers/public/以下に格納できるようにします。
そこで、今日は以下の様な設定の方法を紹介します。
/admin/productsのようなパスでアクセスできる/productsのようなパスでアクセスできる今回、作成するコントローラは管理側をapp/controllers/admin、公開側をapp/controllers/publicというパスに保存していきます。
これらのディレクトリを何はともあれ、作成しましょう。
管理側のControllerのベースになるapp/controllers/admin/application_controller.rbというファイルを作成し、
以下のように記述しましょう。
class Admin::ApplicationController < ApplicationController
endクラス名のAdmin::は名前空間と呼ばれるもので、ものすごく簡単に言うと複数のクラスを一纏めにできるものです。
後ろの< ApplicationControllerはapp/controllers/application_controller.rbに記述されたApplicationControllerを継承させるという意味です。
同様に公開側のControllerのベースになるapp/controllers/public/application_controller.rbも以下のように作成します。
class Public::ApplicationController < ApplicationController
endこのように名前空間を分けたApplicationControllerを用意することで、管理側共通の処理や、公開側共通の処理を書く場所を作ることができました。
class Admin::ProductsController < Admin::ApplicationController
before_action :set_product
def index
@products = Product.all
end
# 後略
endclass Public::ProductsController < Public::ApplicationController
before_action :set_product
def index
@products = Product.all
end
# 後略
endちなみに、ビューファイルはapp/views/admin/products, app/views/public/productsに配置します。
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.rbapp/controllers/admin/products_controller.rbの二種類のControllerを作ることになると思いますが、このように実装することで、管理画面と公開画面がディレクトリごと切り分けられるので、管理しやすくなります。
namespaceやscopeを活用して、メンテナンスしやすいシステムを構築するように工夫しましょう!