RESTが分かればRuby on Rails チュートリアルの見通しがよくなる話

#この記事を読んで得られること
「いきあたりばったり」にチュートリアルをこなすのではなく、一筋の光が通った状態でチュートリアルを進めることができるようになる（かも）

想定読者はWEB周りの予備知識があまりなく
Railsチュートリアル途中か終わってすぐぐらいの人
（私がそうです）

#RESTって何？
雑に言うと、webの設計思想のこと
RailsもRESTの思想に沿って設計されている

実はRailsチュートリアル2章のコラム2.2（第４版の場合）にチュートリアルを
読みこなすのに必要そうなRESTの概要が書かれていますが
よくわからないままサッと見て先に進んだ人もいるのではないでしょうか
私は進みました

が、

RESTの概念はチュートリアル中ついて回っている（というか骨子とすら言える）ので
チュートリアル中に早めになんとなくでも掴んでおいたほうが
一貫した構造や著者が考えていることが見えてきて迷子になりにくいのではないかと思います

RESTの概念はかなり抽象的なのですぐ全部理解しなくてもよいと思いますが
わかるとチュートリアル内のことだけでなくチュートリアルの外の
web世界も少しクリアに見ることができてお得です

以下、自分が感じたレベル別に解説していく

[レベル１　HTTPリクエストとCRUD操作の関係の理解](#レベル１httpリクエストとcrud操作の関係の理解)
[レベル２　resourcesでルーティングされる内容の理解](#レベル２resourcesでルーティングされる内容の理解)
[レベル３　scaffoldで生成される謎のアクション群の理解](#レベル３scaffoldで生成される謎のアクション群の理解)
[レベル４　RESTそのものの理解](#レベル４RESTそのものの理解)

#レベル１　HTTPリクエストとCRUD操作の関係の理解

ユーザがブラウザを操作するとHTTPリクエストが送られる
Railsチュートリアルではそのリクエストを元にデータベースを操作する部分を書いたり
ブラウザ操作手順をテストに書いて動作確認することがほとんどだ

これだけわかればチュートリアル中の内容はとりあえず何とかなると思う

・８つあるHTTPリクエストのうちよく使われる４つ

| HTTPリクエスト|  処理 |
|---|---|
|  GET |  取得 |
|  POST |  登録 |
|  PUT | 更新 |
|  DELETE | 削除 |

　
・データベースに必要な操作

| 　CRUD操作　| 処理 | 
|---|---|---|
| READ | 取得 | 
| CREATE| 登録 | 
| UPDATE| 更新 | 
| DELETE| 削除 | 

　
・それぞれの対応

| HTTPリクエスト| CRUD操作 |処理 |
|---|---|---|
|  GET | READ | 取得 |
|  POST | CREATE | 登録 |
|  PUT | UPDATE |更新 |
|  DELETE | DELETE | 削除 |


#レベル２　resourcesでルーティングされる内容の理解


Q：「routes.rb」に「resources :users」と書くだけで
　　なんで諸々よしなにルーティングしてくれるの？

```ruby:routes.rb
Rails.application.routes.draw do
  resources :users
end
```

A:　Railsはresourcesと宣言するとデフォルトで勝手に
　　GETとPOSTとPUTとDELETEに基づいて気を利かせて
　　URLとコントローラーのアクションを対応付けて以下を生成してくれます


| URL             | アクション | HTTPリクエスト|名前付きルート | 用途                |
|:----------------|:--------|:----------|:----------|:------------------ |
| /users          | index   | GET       | users_path |ユーザ一覧画面を表示   |
| /users/:id     | show    | GET       | user_path(user) |特定ユーザの画面を表示 |
| /users/new     | new     | GET       | new_user_path |新規ユーザの登録画面を表示 |
| /users/:id/edit | edit    | GET       | edit_user_path(user)|ユーザの編集画面を表示 |
| /users       | create  | POST      | 	users_path |ユーザの登録アクション      |
| /users/:id     | update  | PATCH/PUT    | user_path(user)|ユーザの更新アクション    |
| /users/:id     | destroy | DELETE    | user_path(user)|ユーザの削除アクション    |


#レベル３　scaffoldで生成される謎のアクション群の理解
scaffoldを使うとusersコントローラの中に以下の7アクションが勝手に生成されると思います

def index
def show
def new
def edit
def create
def update
def destroy

初めの頃は勝手にいろいろ作られて何がなんだかわからなかったと思いますが
ここまでくればそれぞれの関連が見えてきたと思います
この７つなのはRailsのテンプレートだからということみたいです。
（不要なアクションは削除できるし
　必要なら自作アクションを追加することが可能）

説明が前後してしまいますが
「routes.rb」に「resources :コントローラ名」と書くと７アクションすべてのルーティングになりますが
チュートリアル13章のように:onlyオプションをつけると必要なルーティングだけを生成できます


```ruby:routes.rb
Rails.application.routes.draw do
  resources :microposts, only: [:create, :destroy]
end
```



#レベル４　RESTそのものの理解
結局RESTって？

本来のRESTの設計原則は以下の４つあるようです


>+ アドレス指定可能なURIで公開されていること
>+ インターフェース(HTTPメソッドの利用)の統一がされていること
>+ ステートレスであること
>+ 処理結果がHTTPステータスコードで通知されること

引用元：[REST入門 基礎知識](https://qiita.com/TakahiRoyte/items/949f4e88caecb02119aa)

Railsチュートリアルで必要なのは上記のREST原則のうち

+ __インターフェース(HTTPメソッドの利用)の統一がされていること__

だけです。（この記事もそこに焦点を当てています）
その他のことの詳細は引用元リンクをご参照ください

ただ、これだけわかっていれば各種サービスのAPIもRESTを意識して作られていることが
多いようなので、ほかのRESTfulなサービスとの連携がしやすいということになります

#まとめ

Railsを使うならRESTfulなスタイルを採用するのが前提ということが
なんとなくわかってもらえれば幸いです

自分で作る部分もRESTに沿うし、Railsがよしなにやってくれる部分も
RESTに沿っているのでそのことを理解しながらチュートリアルを進めたほうがよさそうです