[忘備録]railsのresources・resourceメソッドについて

# 更新履歴
| 日付 | 更新内容 | 
|:-:|:-:|
| 2019/3/22  | 初稿  | 
| 2019/3/23  | resourceメソッドで生成されるURLを修正  |
| 2019/3/28  | resourceメソッドについて学習したことを追加| 

# 本記事の目的
- 自身のキャリアのため、最近勉強し始めたrailsの忘備録のメモを記録
- 今回resources,resourceメソッドについてまとめる

# resourcesメソッドって?
- あるリソースに対する標準的な操作(CRUD)がまとめてルート定義される
- config/routes.rbに`resources :(リソース対象)`の形式記述する

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :books
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

上記コードで定義されるルート一覧

```shell:bash
[vagrant@default railsbook]$ rails routes
                   Prefix Verb   URI Pattern                                                                              Controller#Action
                    books GET    /books(.:format)                                                                         books#index
                          POST   /books(.:format)                                                                         books#create
                 new_book GET    /books/new(.:format)                                                                     books#new
                edit_book GET    /books/:id/edit(.:format)                                                                books#edit
                     book GET    /books/:id(.:format)                                                                     books#show
                          PATCH  /books/:id(.:format)                                                                     books#update
                          PUT    /books/:id(.:format)                                                                     books#update
                          DELETE /books/:id(.:format)                                                                     books#destroy
```
## (余談)CRUDとは
- データベースのリソースに対する操作(Create,Read,Update,Delete)のまとめて略したもの
- Webアプリケーションで基本的に実装されている４種類の機能

# resourcesメソッドで定義されるルート一覧
| URLパターン | 呼び出すアクション | HTTPメソッド | 役割 |
|:-:|:-:|:-:|:-:|
| /(リソース名)(.:format)  |index   | GET  | 一覧画面を表示   |
| /(リソース名)/:id(.:format)  | show  | GET  | idで指定されたリソースの詳細画面を表示   |
|/(リソース名)/new(.:format)   | new  | GET  | 新規登録画面を表示  |
|/(リソース名)   | create  | POST  | 新規登録画面の入力内容で登録処理   |
| /(リソース名)/:id/edit(.:format)  | edit  | GET  | :idで指定したリソースの編集画面を表示  |
| /(リソース名)/:id(.:format)  | update  | PATCH  | idで指定したリソースの更新処理   |
| /(リソース名)/:id(.:format) | destroy | DELETE | :idで指定したリソースの削除処理|
## :idと:formatって何だろう?
- `/books/:id/edit(.:format)`のように「:名前」でパラメータが指定されている
- 変数のプレースホルダーで任意の値を代入してアクションメソッドに渡すことができる
    - ()がついているパラメータは省略可能であることを意味する
- URL経由で任意のパラメータを受け渡しできることを覚えておく 
- (.:format)は、出力形式を指定するパラメータ
    - .htmlを指定した場合には、てhtml形式の出力を生成するテンプレートが呼び出される
        - ~.html.erbとか
    - .jsonを指定した場合にはjson形式で出力される
        - ~.json.jbuilderとか
    - 与えられた拡張子に応じたテンプレートを呼び出す
    
`/books/:id/edit(.:format)`のリクエストURL例.
- `http://localhost:3000/books/108/edit`
    - booksテーブルのidカラムの値が108の編集画面を表示する

# resourceメソッドとは
-  単一のリソースを対象として標準的な操作(CRUD)のルートが定義される
    -  resoucesであればbooks(複数形)を対象としている
    -  resourceメソッドは１冊のbookを対象としてルートを定義

## resourcesメソッドと何が違うの
- indexアクションに対応するルートが定義されない
- show/edit/deleteのパスにはパラメータを要求しない
    - 単数形であるためidが必要ない
    - 
| URL | アクション | HTTPメソッド | 役割 |
|:-:|:-:|:-:|:-:|
|/config(:format)   | show | GET  | リソースの詳細画面を表示  |
|/config/new(:format)   | new  | GET  | 新規登録画面を表示  |
|/config/create   | create  | new  | 新規登録画面の入力内容で登録処理  |
|/config/edit  | edit  | GET  | 既存のリソースの編集画面を表示  |
|/config   | update  | PATCH  | 編集画面の入力内容で更新処理  |
|/config   | delete  | DELETE  |リソースの削除処理   |

## 何に使えそうか
- ログインの成功後にsessionにユーザ情報を格納
- sessionからユーザ情報を取り出せるため自分自身に対しての処理(updateとかdelete)はresourceで宣言してもいいかもしれない


# まとめ
- resourcesメソッドをroutes.rbに記述することで、CRUDを提供するためのルートが定義される
- :名前でアクションメソッドにパラメータを渡すことができる

今回はresourcesメソッドのごく基本的な機能について学んだことを忘備録として記事にしました。
もっと多くのことを学んで有用な記事をかけるように勉強していきます。