🏃‍♂️

【Rails】Routing : scope / namespace / scope module

2023/07/16に公開

Routingのグループ化させるメソッドについて解説。

Routingの説明

各用語のおさらい。

項目 意味
Prefix ルーティングの名前付けに使用される。例えば、items#index は items_path というヘルパーメソッドができる。これにより、ビューなどで簡単にURLを生成できる。
Verb HTTPメソッドで、リクエストの種類を表す。GET(データの取得)、POST(データの作成)、PATCH(データの更新)、DELETE(データの削除)など
URI Pattern ルーティングのパスパターン。
Controller#Action ルーティングにマッチした場合に呼び出されるコントローラとアクションの組み合わせ。

例:

Prefix Verb URI Pattern Controller#Action
items GET /admin/items admin/items#index
  • items#index: GETメソッドで /admin/items にアクセスした場合、admin/items コントローラの index アクションが呼び出される。

scope / namespace / scope module の違い

これらはルーティングの設定方法。このメソッドを使用すると、アプリケーションのルーティングを変更し、URLのパスや、コントローラ・ビューの配置を設定することができる。
各メソッドをまとめると次の通り。

メソッド ルーティングのパスを変更するか? コントローラやビューのパスを変更するか?
scope はい いいえ
namespace はい はい
scope module いいえ はい
  • ルーティングのパスを変更する
    URLのパス部分を変更すること。例えば、scope "/admin" を使用すると、パスが "/admin" で始まるようになる。
  • コントローラやビューのパスを変更する
    コントローラやビューファイルの配置場所を変更すること。例えば、namespace :admin を使用すると、コントローラやビューファイルが "app/controllers/admin" や "app/views/admin" などの特定のディレクトリ内に配置される。

それぞれ解説していく。

scope

例えば、ECサイトの商品一覧ページを/itemsのURLで表示したいする。通常のルーティングは以下のようになる。

Rails.application.routes.draw do
  resources :items
end

これでは以下のようなルーティングが生成される。

Prefix Verb URI Pattern Controller#Action
items GET /items items#index
POST /items items#create
new_item GET /items/new items#new
edit_item GET /items/:id/edit items#edit
item GET /items/:id items#show
PATCH /items/:id items#update
DELETE /items/:id items#destroy

しかし、商品一覧ページを/itemsではなく/productsのURLで表示したいと思った場合に、scopeを使って以下のように変更できる。

Rails.application.routes.draw do
  scope '/products' do
    resources :items
  end
end

これにより、ルーティングは次のように変更される。

Prefix Verb URI Pattern Controller#Action
products GET /products items#index
POST /products items#create
new_product GET /products/new items#new
edit_product GET /products/:id/edit items#edit
product GET /products/:id items#show
PATCH /products/:id items#update
DELETE /products/:id items#destroy

scope '/products' doの部分で、/productsの接頭辞を追加したことにより、商品一覧ページは/productsというURLでアクセスできるようになった。
また、ItemsControllerの名はそのままで変化しない。

2. namespace

次に、管理画面を作成する場合を考えてみる。通常のルーティングを以下のようにする。

Rails.application.routes.draw do
  resources :items
end

これはscopeと同じルーティングだが、管理画面のコントローラをAdminというグループ(名前空間)にまとめたいと思った場合に、namespaceを使って以下のように変更できる。

Rails.application.routes.draw do
  namespace :admin do
    resources :items
  end
end

これにより、ルーティングは次のように変更される。

Prefix Verb URI Pattern Controller#Action
admin_items GET /admin/items items#index
POST /admin/items items#create
new_admin_item GET /admin/items/new items#new
edit_admin_item GET /admin/items/:id/edit items#edit
admin_item GET /admin/items/:id items#show
PATCH /admin/items/:id items#update
DELETE /admin/items/:id items#destroy

namespace :admin doの部分で、コントローラがAdminという名前空間の下にまとめられた。これにより、管理画面のコントローラはAdmin::ItemsControllerというように名前空間が追加され、URLも/adminの接頭辞が追加される。

3. scope module

最後に、ユーザーごとにカートページを表示したいと思った場合を考えてみる。通常のルーティングを以下のようにする。

Rails.application.routes.draw do
  resources :carts
end

これはカートページを/cartsのURLで表示するルーティング。しかし、ユーザーごとにカスタマイズしたカートページを表示したい場合に、scope moduleを使って以下のように変更できる。

Rails.application.routes.draw do
  scope module: :users do
    resources :carts
  end
end

これにより、ルーティングは次のように変更される。

Prefix Verb URI Pattern Controller#Action
carts GET /carts users/carts#index
POST /carts users/carts#create
new_cart GET /carts/new users/carts#new
edit_cart GET /carts/:id/edit users/carts#edit
cart GET /carts/:id users/carts#show
PATCH /carts/:id users/carts#update
DELETE /carts/:id users/carts#destroy

この例では、/cartsというURLでユーザーごとのカートページが表示される。scope moduleを使用しているため、URLは変わらないが、コントローラ名はUsers::CartsControllerというように名前空間が追加される。

参照

ありがとうございました!

https://qiita.com/ryosuketter/items/9240d8c2561b5989f049

Discussion