【Rails】scope/namespace/moduleに向き合う
こんにちは。
PF作成にてnamespace/scope/moduleなどの名前空間でグループ化することと向き合う機会があったので、
アウトプットしていこうと思います。
namespace
namespaceは URLは指定のパスにしたい、かつファイル構成のパスも指定したい場合に使用します。
つまり、URI PatternとController#Actionを同時にカスタマイズしたい時に使用します。
下記のようにルーティングを設定すると...
namespace :admin do
resources :articles
end
下記のようにルーティングされます。
| Prefix | Verb | URI Pattern | Controller#Action |
|---|---|---|---|
| admin_articles | GET | /admin/articles | admin/articles#index |
| new_admin_article | GET | /admin/articles/new | admin/articles#new |
| *以下略 |
通常のresources :articlesであれば、上記のadminの部分は追記されていません。
namespaceを使用することで、app/controllers/adminディレクトリ配下にコントローラをグループ化することができます。
scope
scopeはURLは指定のパスにしたい、かつファイル構成は変更したくない時に使用します。
つまりURI Patternのみをカスタマイズしたい時に使用します。
下記のようにルーティングを設定すると...
scope :admin do
resources :articles
end
省略した形で記述することもできます。
resources :articles, path: '/admin/articles'
下記のようなルーティングとなります。
| Prefix | Verb | URI Pattern | Controller#Action |
|---|---|---|---|
| articles | GET | /admin/articles | articles#index |
| new_article | GET | /admin/articles/new | articles#new |
| *以下略 |
今回はURI Patternのみadminが付加されています。なので、app/controllersディレクトリ配下のコントローラであることがわかります。
module
module(scope module)はURLのパスは変更したくない、かつファイル構成は指定したい時に使用します。
つまり、Controller#Actionのみ変更したい時に使用します。
下記のようにルーティングを設定すると...
scope module: :admin do
resources :articles
end
省略した形で記述する場合は下記の通りです。
resources :articles, module: 'admin'
下記のルーティングとなります。
| Prefix | Verb | URI Pattern | Controller#Action |
|---|---|---|---|
| articles | GET | /articles | admin/articles#index |
| new_article | GET | /articles/new | admin/articles#new |
| *以下略 |
役割はかなり違いますが、混同しやすいものでもあるので
しっかり抑えていきます。
最後までお読みいただきありがとうございました。
参考
コントローラの名前空間とルーティング - Railsガイド
【Rails】ルーティングにおけるnamespace/scope/moduleの違いと使い方について
Railsのroutingにおけるscope / namespace / module の違い
Discussion