【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