LoginSignup
2
1

More than 1 year has passed since last update.

【Rails】ルーティングのグループ化(scope / scope module / namespace)

Posted at

ルーティングのグループ化のメリット

namespaceの例を挙げて説明すると、

①集合を分けることで同じ名前を使うことができる
たとえば管理者用のログイン機能を実装するときに、user_sessions_controllerという名前を使おうとする。
しかし、既にサービスのログイン機能の実装の際に、その名前のコントローラー名を使用していると、アプリの挙動がおかしくなってしまう可能性がある。

②参照が簡単になる
ディレクトリを見たときに、グループ別でファイルを分けておくと、人間も管理しやすく、アプリケーションもファイルの参照が容易になる(メンテナンスしやすくなる)。

namespace / scope / scope moduleの違い

ルーティングのグループ化には、namespace / scope / scope moduleの3つがある。

この3つの大まかな違いは以下の通り。

URL ファイル構成
scope 指定のパスにしたい 変えたくない
module 変えたくない 指定のパスにしたい
namespace 指定のパスにしたい 指定のパスにしたい

もっと分かりやすく区別すると、rails routesした時に出てくる、Prefix/URI/Patternこの部分の差である。

Image from Gyazo

◆scope

scopeメソッドを用いてルーティングをグループ化すると、パスのみグループ化ができる。
しかし、パスをグループ化しただけで、呼び出すコントローラやPrefixはルーティングをグループ化する前と同じ。

routes.rb
scope :admin do
    resources :boards
end

Image from Gyazo

◆scope module

scopeメソッドとmoduleオプションを用いてルーティングをグループ化すると、呼び出すコントローラのアクションのみグループ化ができる。
Prefixやパスに関しては、ルーティングをグループ化する前と同じ。

routes.rb
scope module: :admin do
    resources :boards
  end

Image from Gyazo

◆namespace

namespaceメソッド(名前空間)を用いてルーティングをグループ化すると、指定した名前空間名でルーティンングをグループ化することができる。
ターミナルで確認すると、Prefix, URIパス, Controller#Actionに名前空間名が付与されていることが分かる。
namespaceメソッドを用いたルーティングのグループ化は、名前空間によって識別されたコントローラのアクションを実行したい時に使用。(例の場合、名前空間名をadminとしている)

routes.rb
namespace :admin do
    resources :boards
end

Image from Gyazo

⚠️namespaceを利用するときは、Controller内に実際のURLパスと同様のディレクトリ構成を作る必要がある。

またこの例の場合、admincontrollerを作成する際には、管理者用のコントローラを作成するにあたって、「管理系」のカテゴリとして区分したいため、Admin::BaseControllerとして命名する必要がある。

ディレクトリ構成.
─ app
 ├ controllers
 │└ 【名前空間名】
 │ └ 【コントローラ名】_controller.rb
 └ views
  └ 【名前空間名】
   └ 【コントローラ名】
    └ 【アクション名】.html.erb
class 【名前空間名】::【コントローラ名】Controller < ApplicationController
   アクション
end

ルーティングのグループ化についてのまとめは、以下の通りになる。
namespaceではPrefix、URI Pattern、Controller#Action
scopeではURI Pattern のみ
scope moduleController#Actionのみ

参考記事

Railsのルーティングを学ぼう③
【Rails】ルーティングの色々な作成方法をざっくりまとめてみた
Railsのroutingにおけるscope / namespace / module の違い
【Ruby on Rails】ルーティング scope と namespace の違い
namespace を使ってコントローラーをグループ化する

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1