【Rails】scope/namespace/moduleに向き合う


こんにちは。

PF作成にてnamespace/scope/moduleなどの名前空間でグループ化することと向き合う機会があったので、
アウトプットしていこうと思います。

namespace

namespaceは URLは指定のパスにしたい、かつファイル構成のパスも指定したい場合に使用します。
つまり、URI PatternController#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 の違い