Rails resourcesメソッドとresourceメソッド

#はじめに
今回はRaiilsでRESTfulなルート設計を定義するメソッド

* resourcesメソッド
* resourceメソッド

についてまとめます。

RailsのルーティングとRESTfulについてはこちらにもまとめていますので、よかったら見てください。
[Rails ルーティングの基礎とRESTful](https://qiita.com/Tamitchao/items/771e64f4753ff541d444)
#resourcesメソッド
RESTfulなルート設計を定義するメソッドです。
「config/routes.rb」で呼び出します。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users
end
```
ターミナルで「rake routes」を実行し、ルーティングを表示すると次のようになります。
※見やすいように多少整形しています

```
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```
「resources :users」の一行だけで、次のルートが定義されていることがわかります。

| URL                       | アクション | HTTPメソッド | 動作                |
|:--------------------------|:--------|:----------|:------------------ |
| /users(.:format)          | index   | GET       | ユーザ一覧画面を表示   |
| /users(.:format)          | create  | POST      | ユーザの登録処理      |
| /users/new(.:format)      | new     | GET       | ユーザの登録画面を表示 |
| /users/:id/edit(.:format) | edit    | GET       | ユーザの編集画面を表示 |
| /users/:id(.:format)      | show    | GET       | ユーザの詳細画面を表示 |
| /users/:id(.:format)      | update  | PATCH     | ユーザの更新処理      |
| /users/:id(.:format)      | update  | PUT       | ユーザの更新処理      |
| /users/:id(.:format)      | destroy | DELETE    | ユーザの削除処理      |
また、resourcesメソッドは名前付きルートも自動で生成します。

| 名前付きパス(_path)   | 名前付きパス(_path) | 対応するパス      |
|:-------------------|:------------------|:----------------|
| users_path         | users_url         | /users          |
| user_path(id)      | user_url(id)      | /users/:id      |
| new_user_path      | new_user_url      | /users/new      |
| edit_user_path(id) | edit_user_url(id) | /users/:id/edit |
#resourceメソッド
resourcesメソッドは複数のリソースに対応したルートを定義したのに対し、
resourceメソッドは単一のリソースに対応したルートを定義します。

```ruby:routes.rb
Rails.application.routes.draw do
  resource :user
end
```
ターミナルで「rake routes」を実行し、ルーティングを表示すると次のようになります。
※見やすいように多少整形しています

```
Prefix     Verb   URI Pattern          Controller#Action
new_users  GET    /user/new(.:format)  users#new
edit_users GET    /user/edit(.:format) users#edit
users      GET    /user(.:format)      users#show
           PATCH  /user(.:format)      users#update
           PUT    /user(.:format)      users#update
           DELETE /user(.:format)      users#destroy
           POST   /user(.:format)      users#create
```

| URL                   | アクション | HTTPメソッド | 動作                |
|:----------------------|:--------|:----------|:------------------ |
|  /user/new(.:format)  | new     | GET       | ユーザの登録画面を表示 |
| /user/edit(.:format)  | edit    | GET       | ユーザの編集画面を表示 |
| /user(.:format)       | show    | GET       | ユーザの詳細画面を表示 |
| /user(.:format)       | update  | PATCH     | ユーザの更新処理      |
| /user(.:format)       | update  | PUT       | ユーザの更新処理      |
| /user(.:format)       | destroy | DELETE    | ユーザの削除処理      |
| /user(.:format)       | create  | POST      | ユーザの登録処理      |

resourcesメソッドとは異なる部分があることが分かります。

* アクションのindexに対応するルートがない
* idパラメータを要求していない

また、 **resourceメソッドでもコントローラは複数形**になっています。

resourcesメソッドと同様に、resourceメソッドも名前付きルートを自動で生成します。

| 名前付きパス(_path) | 名前付きパス(_path) | 対応するパス  |
|:------------------|:-----------------|:------------|
| user_path         | user_url         | /users      |
| new_user_path     | new_user_url     | /users/new  |
| edit_user_path    | edit_user_url    | /users/edit |

#おわりに
resourcesメソッドとresourceメソッドについてまとめましたが、
他にもルートパラメータに制約をかけたり、フォーマットに対応しないようにしたりなど
色々と定義できるようです。
その辺りも今後、調べてまとめてみたいと思います。