LoginSignup
0
0

【Ruby on Rails】namespace と scope の違いって何?

Last updated at Posted at 2024-06-12

はじめに

こんにちは、エンジニア3年目の嶋田です。
まずは、この記事を開いていただきありがとうございます!

Railsアプリケーションを開発していると、ルーティングの設計がとても大切だと感じることが増えてきました。
同時に自分の理解が浅いことも実感しています…
そこで今回はこの記事でアウトプットをして理解を深めていきたいです。

よろしくお願いします!

目次

namespaceとscopeの違い

Railsのルーティングでは、namespacescope を使用することでルートを整理することができます。これらの機能は似ていますが、それぞれ異なる目的と使い方があります。

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

使い分けのポイント

namespacescope の使い分けは、以下のポイントを考慮すると良いでしょう。

  • モジュールの整理が必要な場合: コントローラーをモジュールで整理したい場合はnamespaceを使用します。
  • URLパスだけを変更したい場合: URLパスをカスタマイズしたいが、コントローラーは変更したくない場合はscopeを使用します。

カスタムルートの利用

namespacescope 以外にも、Railsのルーティングでは scope moduleshallow オプションを使用して、さらに柔軟にルーティングを設定できます。

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アプリケーションの重要な部分です。
私自身まだまだ理解が足りず、難しいなと感じている今日この頃です…😅
この記事が少しでも皆さんの助けになれば幸いです。引き続き楽しく学んでいきましょう!

参考文献

0
0
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
0
0