26
8

【Rails】ルーティングのnamespaceとscopeの違いについて

Last updated at Posted at 2024-05-09

はじめに

「管理用の一覧ページを表示したい」と思った時に今までnamespaceを使っていました。
今回、イベントの管理アプリを作成している中で、scopeを使ってみてそれらの違いについてまとめてみました。

結論

大きな違いは次の通りです。

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

ルーティングファイル内容

routes.rb

  # 一般ユーザーの一覧ページ
  resources :events
  
  # namespaceの場合
  namespace 'manage' do
    resources :events
  end

  # scopeの場合
  scope :manage do
    get 'events', to: 'events#manage_events'
    # Restfulなルートの場合
    # resources :events
  end

(補足)
scopeでは、resourceを使用した場合に通常のindexアクションに対応するルートが自動で生成されて呼び出されます。
例えばindexアクションとは別に、manage_eventsで一覧表示したい場合、手動でルートを作成する必要があることに気づきました。

namespace

特徴

namespace(名前空間)を使うと、指定した名前空間内でルーティングをグループ化できます。
以下の例はmanageという名前空間を付与しています。

ルート一覧

スクリーンショット 2024-05-10 6.14.23.png

ファイル構成

コントローラー
スクリーンショット 2024-05-10 5.15.13.png

ビュー
スクリーンショット 2024-05-10 6.25.45.png

namespaceのメリット

  • ルートやコントローラーのグループ化ができる
    一般ユーザーと管理ユーザーでファイルを分けたい時などに便利ですね。

  • リソースの名前やルートが衝突するのを防げる
    resourcesを使用しても、そのルートは通常のリソースとは異なる名前空間に属することになります。
    例えば、一般ユーザーと管理ユーザーのページを作成する場合、リソースとは別々に使用できます。

namespaceのデメリット

  • URLが長くなる
    深い階層の名前空間に設定した場合にURLが複雑になり、理解しにくくなることがあります。

  • コードや構造が複雑になりやすくなる
    複数の名前空間を使用した場合、アプリケーションの構造が複雑化し保守しにくくなるリスクがあります。

scope

特徴

namespaceと同様にルーティングをグループ化しますが、
違いはパスのみグループ化できることです。

そのため、ファイル構成は変えなくて済みます。

ルート一覧

Restfulなルートの場合
スクリーンショット 2024-05-10 6.42.12.png

手動で作成したルートの場合
スクリーンショット 2024-05-10 6.56.59.png

ファイル構成

コントローラー
スクリーンショット 2024-05-10 6.48.11.png

ビュー
Restfulなルートの場合
スクリーンショット 2024-05-10 6.45.36.png

手動で作成したルートの場合(manage_eventsアクションを呼び出しています)
スクリーンショット 2024-05-10 6.57.35.png

scopeのメリット

  • ファイル構成はそのままでURLのみ変えられる
    namespaceのようにファイル構成を変更せずにルートのみ変えることが可能です

scopeのデメリット

  • 通常のリソースと区別することが難しくなる
    上記の例のように、scope外のresourcesのindexアクションが呼ばれてしまうという問題がありました。
    そのため、手動でルートを作成するなどの対応が必要そうです。

まとめ

(アプリケーションの要件によると思いますが)
管理者用やAPIの機能を名前空間で明示的に分けたいときは、namespace
特定のパスをグループ化したいときは、scope
といった使い分けに基本的になるのかな?と思いました。

参考記事

Railsのroutingにおけるscope / namespace / module の違い

26
8
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
26
8