経緯
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::
が名前空間になります。後ろの< ApplicationController
はapp/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の設計に無駄をなくす
コメントを残す