[Rails] routes.rbのnamespace, module, scopeの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbでnamespaceが使用されていたので、その意味、また使用方法が似ているmoduleとscopeとの違いについて備忘録、知識の定着のためにまとめる。

1.namespace
2.scope
3.module

# 1.namespace
namespaceの中にルーティング設定を記述すると
・urlがnamespaceで指定したモジュール名下のpathになる
・controllerファイルがnamespaceで指定したモジュール名のディレクトリ下に配置される
・controllerのクラス名が`namespaceで指定したモジュール名::コントローラ名` になる
### 例)
### routes.rbに記述
```
Rails.application.routes.draw do
  namespace :admin do
    resources :users
  end
end
```
#### $rails routes
```
admin_users     GET    /admin/users(.:format)           admin/users#index
                POST   /admin/users(.:format)           admin/users#create
new_admin_user  GET    /admin/users/new(.:format)       admin/users#new
edit_admin_user GET    /admin/users/:id/edit(.:format)  admin/users#edit
admin_user      GET    /admin/users/:id(.:format)       admin/users#show
				PATCH  /admin/users/:id(.:format)       admin/users#update
				PUT    /admin/users/:id(.:format)       admin/users#update
				DELETE /admin/users/:id(.:format)       admin/users#destroy
```
#### controllerファイル配置場所
app/controllers/admin/users_controller.rb
#### controllerのクラス名
```
class Admin::UsersController < ApplicationController

end
```

# 2.scope
scopeの中にルーティング設定を記述すると
・urlがnamespaceで指定したモジュール名下のpathになる
### 例)
#### routesに記述
```
Rails.application.routes.draw do
  scope :admin do
    resources :users
  end
end
```
#### $ rails routes
```
users     GET    /admin/users(.:format)            users#index
		  POST   /admin/users(.:format)            users#create
new_user  GET    /admin/users/new(.:format)        users#new
edit_user GET    /admin/users/:id/edit(.:format)   users#edit
user      GET    /admin/users/:id(.:format)        users#show
		  PATCH  /admin/users/:id(.:format)        users#update
          PUT    /admin/users/:id(.:format)        users#update
          DELETE /admin/users/:id(.:format)        users#destroy
```
#### controllerファイル配置場所
app/controllers/users_controller.rb
#### controllerのクラス名
```
class UsersController < ApplicationController

end
```

# 3.module
scopeの中にルーティング設定を記述すると
・controllerファイルがmoduleで指定したモジュール名のディレクトリ下に配置される
・controllerのクラス名が`moduleで指定したモジュール名::コントローラ名` になる
### 例)
#### routes.rbに記述
```
Rails.application.routes.draw do
  scope module: :admin do
    resources :users
  end
end
```
#### $rails routes
```
users     GET    /users(.:format)             admin/users#index
	      POST   /users(.:format)             admin/users#create
new_user  GET    /users/new(.:format)         admin/users#new
edit_user GET    /users/:id/edit(.:format)    admin/users#edit
user      GET    /users/:id(.:format)         admin/users#show
          PATCH  /users/:id(.:format)         admin/users#update
		  PUT    /users/:id(.:format)         admin/users#update
          DELETE /users/:id(.:format)         admin/users#destroy
```
#### controllerファイル配置場所
app/controllers/admin/users_controller.rb
#### controllerのクラス名
```
class Admin::UsersController < ApplicationController

end
```

# まとめ
|  | namespace | scope | module |
| -- | -- | -- | -- |
|urlが指定したモジュール名下のpathになる|○|○|×|
|controllerファイルが指定したモジュール名のディレクトリ下に配置される|○|×|○|
|controllerのクラス名が`指定したモジュール名::コントローラ名` になる|○|×|○|

# 参考にさせていただいた記事
- [Railsのroutingにおけるscope / namespace / module の違い](https://qiita.com/ryosuketter/items/9240d8c2561b5989f049https://qiita.com/ryosuketter/items/9240d8c2561b5989f049)
- [【Rails】ルーティングにおけるnamespace/scope/moduleの違いと使い方について](https://techtechmedia.com/namespace-scope-module-routing/)

# resourcesについてはこちらをご参照ください
- [[Rails] routes.rbのresource, resourcesの違い](https://qiita.com/siakio/items/dda2bfd35fe35e154f01)