はじめに
こんにちは、エンジニア3年目の嶋田です。
まずは、この記事を開いていただきありがとうございます!
Railsアプリケーションを開発していると、ルーティングの設計がとても大切だと感じることが増えてきました。
同時に自分の理解が浅いことも実感しています…
そこで今回はこの記事でアウトプットをして理解を深めていきたいです。
よろしくお願いします!
目次
namespaceとscopeの違い
Railsのルーティングでは、namespace と scope を使用することでルートを整理することができます。これらの機能は似ていますが、それぞれ異なる目的と使い方があります。
namespace
namespace はコントローラーのモジュールをグループ化するために使用されます。namespaceを使うと、自動的にURLパスとコントローラーの名前空間が設定されます。
例えば、以下のように設定します。
namespace :admin do
resources :users
end
この設定により、/admin/users というパスが生成され、対応するコントローラーは Admin::UsersController になります。
scope
scope はURLパスや名前空間をカスタマイズするために使用されます。scopeを使うと、URLパスだけを変更することができ、コントローラーの名前空間を変更しません。
例えば、以下のように設定します。
scope '/admin' do
resources :users
end
この設定により、/admin/usersというパスが生成されますが、対応するコントローラーはUsersControllerのままです。
namespaceの使い方
namespaceを使用すると、関連するコントローラーをモジュール内にグループ化し、名前空間付きのURLを生成できます。
基本的な使い方
例えば、管理者用のコントローラーをまとめるためにnamespaceを使用します。
namespace :admin do
resources :products
end
これにより、以下のようなルーティングが生成されます。
-
GET /admin/products->Admin::ProductsController#index -
GET /admin/products/:id->Admin::ProductsController#show -
POST /admin/products->Admin::ProductsController#create
ネストしたリソース
namespaceはネストしたリソースにも使用できます。
namespace :admin do
resources :products do
resources :reviews
end
end
これにより、/admin/products/:product_id/reviews のようなパスが生成されます。
scopeの使い方
scopeを使用すると、URLパスをカスタマイズしつつ、コントローラーの名前空間は変更しません。
基本的な使い方
例えば、URLパスだけを変更したい場合にscopeを使用します。
scope '/admin' do
resources :products
end
これにより、以下のようなルーティングが生成されますが、コントローラーは変更されません。
-
GET /admin/products->ProductsController#index -
GET /admin/products/:id->ProductsController#show -
POST /admin/products->ProductsController#create
パスとパラメータのカスタマイズ
scopeを使用して、パスとパラメータをカスタマイズすることもできます。
scope '/admin', as: 'admin' do
resources :products, path: 'items'
end
これにより、以下のようなルーティングが生成されます。
-
GET /admin/items->ProductsController#index -
GET /admin/items/:id->ProductsController#show -
POST /admin/items->ProductsController#create
使い分けのポイント
namespace と scope の使い分けは、以下のポイントを考慮すると良いでしょう。
-
モジュールの整理が必要な場合: コントローラーをモジュールで整理したい場合は
namespaceを使用します。 -
URLパスだけを変更したい場合: URLパスをカスタマイズしたいが、コントローラーは変更したくない場合は
scopeを使用します。
カスタムルートの利用
namespace と scope 以外にも、Railsのルーティングでは scope module や shallow オプションを使用して、さらに柔軟にルーティングを設定できます。
scope moduleの利用
scope module を使用すると、URLパスを変更せずにコントローラーの名前空間を変更できます。
例えば、以下のように設定します。
scope module: 'admin' do
resources :products
end
この設定により、/products というパスが生成され、対応するコントローラーは Admin::ProductsController になります。
shallowオプションの利用
shallow オプションを使用すると、ネストしたリソースのルートを簡略化できます。これにより、深くネストされたリソースのルーティングが見やすくなります。
例えば、以下のように設定します。
resources :products do
resources :reviews, shallow: true
end
これにより、以下のようなルーティングが生成されます。
-
GET /products/:product_id/reviews->ReviewsController#index -
GET /reviews/:id->ReviewsController#show -
POST /products/:product_id/reviews->ReviewsController#create -
PATCH/PUT /reviews/:id->ReviewsController#update -
DELETE /reviews/:id->ReviewsController#destroy
最後に
最後までお読みいただきありがとうございました。ルーティングの設計はRailsアプリケーションの重要な部分です。
私自身まだまだ理解が足りず、難しいなと感じている今日この頃です…😅
この記事が少しでも皆さんの助けになれば幸いです。引き続き楽しく学んでいきましょう!