【Rails】Routing : scope / namespace / scope module
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
というように名前空間が追加される。
参照
ありがとうございました!
Discussion