はじめに
「管理用の一覧ページを表示したい」と思った時に今までnamespaceを使っていました。
今回、イベントの管理アプリを作成している中で、scopeを使ってみてそれらの違いについてまとめてみました。
結論
大きな違いは次の通りです。
url | ファイル構成 | |
---|---|---|
namespace | 指定のパスにしたい | 変えたい |
scope | 指定のパスにしたい | 変えたくない |
ルーティングファイル内容
# 一般ユーザーの一覧ページ
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という名前空間を付与しています。
ルート一覧
ファイル構成
namespaceのメリット
-
ルートやコントローラーのグループ化ができる
一般ユーザーと管理ユーザーでファイルを分けたい時などに便利ですね。 -
リソースの名前やルートが衝突するのを防げる
resourcesを使用しても、そのルートは通常のリソースとは異なる名前空間に属することになります。
例えば、一般ユーザーと管理ユーザーのページを作成する場合、リソースとは別々に使用できます。
namespaceのデメリット
-
URLが長くなる
深い階層の名前空間に設定した場合にURLが複雑になり、理解しにくくなることがあります。 -
コードや構造が複雑になりやすくなる
複数の名前空間を使用した場合、アプリケーションの構造が複雑化し保守しにくくなるリスクがあります。
scope
特徴
namespaceと同様にルーティングをグループ化しますが、
違いはパスのみグループ化できることです。
そのため、ファイル構成は変えなくて済みます。
ルート一覧
ファイル構成
手動で作成したルートの場合(manage_events
アクションを呼び出しています)
scopeのメリット
- ファイル構成はそのままでURLのみ変えられる
namespaceのようにファイル構成を変更せずにルートのみ変えることが可能です
scopeのデメリット
- 通常のリソースと区別することが難しくなる
上記の例のように、scope外のresourcesのindexアクションが呼ばれてしまうという問題がありました。
そのため、手動でルートを作成するなどの対応が必要そうです。
まとめ
(アプリケーションの要件によると思いますが)
管理者用やAPIの機能を名前空間で明示的に分けたいときは、namespace
特定のパスをグループ化したいときは、scope
といった使い分けに基本的になるのかな?と思いました。