目次
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
# 後略
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
に配置します。
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を活用して、メンテナンスしやすいシステムを構築するように工夫しましょう!