【Ruby on Rails】Web APIの作り方を詳しく解説！

# はじめに
以前にこんな記事を投稿しました。
[【3分で出来る】Ruby on RailsでWeb APIの作成](https://qiita.com/ruemura3/items/4e99a968b18b49829301)

この記事で解説したように、Ruby on Railsは本当に優秀なフレームワークで、簡単なAPIだったら数分で作れちゃうんです。

しかし前回は3分で作ったAPIを実際に動かして試してみたというだけで、ソースコードの中身までは解説しませんでした。

今回はソースコードを見ながら、Ruby on Railsで作ったAPIが動く仕組みを見ていきます。

前回作成したAPIがある状態で解説を行うので、まだの方は上記リンクを見て作ってみてください。5つのコマンドを打つだけで終わります。

## 前提知識
- APIとは
- JSON
- HTTPリクエスト、レスポンス
- GET, POST, DELETE, etc…

## 環境
- ruby 2.6.5
- Rails 6.0.2
- macOS Catalina 10.15.3

# Rails APIの仕組み
前回の記事で一通り作ったAPIを試しましたが、以下の表を覚えていますでしょうか。

|メソッド|パス<br>http://localhost:3000/ の続き|	効果|
|:---:|:---:|:---:|
|GET|users|全件取得|
|POST|users|bodyのjsonでデータ投入|
|GET|users/:id|該当idのデータを取得|
|PATCH|users/:id|該当idのデータをbodyのjsonで更新|
|PUT|users/:id|該当idのデータをbodyのjson更新|
|DELETE|users/:id|該当idのデータを削除|

1行目を例にして、なぜhttp://localhost:3000/users/ にGETリクエストを送るとユーザ情報が全件取得できるのかなど見ていきましょう。

# ルーティング
Railsを触ったことがある人はルーティングを知っているでしょう。

/config/routes.rbにルーティングが記述されています。開いてみてみると以下のように記述されています。

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

「あれ？こんなの書いた覚えはないぞ」と思うかもしれませんが、以下のコマンドを打った際に生成されたものです。

```
$ rails g scaffold user user_id:string password:string
```

scaffoldは必要なものを一通り作ってくれるのでuserに関するものを一通り作成してくれました。その中の一つがルーティングです。

ではルーティングの中にあるresources: usersとはどういう意味でしょうか？

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

これは以下と同じことを意味します。

```
Rails.application.routes.draw do
    get 'users'     => 'users#index'
    get 'users/:id' => 'users#show'
    get 'users/new' => 'users#new'
    post 'users' => 'users#create'
    get 'users/:id/edit' => 'users#edit'
    patch 'users/:id'  => 'users#update'
    delete 'users/:id' => 'users#destroy'
end
```

これ、冒頭に書いた表と大体一致しますよね。（余計なものもありますが）

get 'users' => 'users#index'は

1. http://localhost:3000/users/ にGETリクエストを送ったときは（get 'users'）
2. usersコントローラのindexアクションを実行しろ（'users#index'）

という意味です。

ではusersコントローラのindexアクションを見てみましょう。

# コントローラとアクション
usersコントローラは/app/controllers/users_controller.rbにあります。

中を見てみるとindexメソッドが見つかると思います。これがindexアクションです。

```ruby
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  # GET /users
  def index
    @users = User.all

    render json: @users
  end

# 以下省略、、、
```

ちなみにこのコントローラやその中身も作った覚えがないと思いますが、$ rails g scaffold user user_id:string password:stringのコマンドで生成されたものです。scaffoldすごい！

indexアクションの中身を見てみると

ユーザをすべて取得して（@users = User.all）
jsonにして返す（render json: @users）
となっています。

以上のルーティング、コントローラ、アクションを踏まえると、なぜhttp://localhost:3000/users/ にGETリクエストを送るとユーザ情報が全件取得できるのか分かったのではないでしょうか。

他に関しても同様です。

# 自分のオリジナルに作り変える
APIは以下の動きをすると書いていますが、これはあくまでもscaffoldのコマンドに任せて作成した場合の話です。

|メソッド|パス<br>http://localhost:3000/ の続き|効果|
|:---:|:---:|:---:|
|GET|users|全件取得|
|POST|users|bodyのjsonでデータ投入|
|GET|users/:id|該当idのデータを取得|
|PATCH/PUT|users/:id|該当idのデータをbodyのjsonで更新|
|DELETE|users/:id|該当idのデータを削除|

例えば

- usersコントローラのindexアクションの中身をいじれば、全件取得ではなくidの昇順に並べたときの上から10個だけ取得するようにできる
- usersコントローラのcreateアクション（post ‘users’）をいじれば、パスワードを暗号化する処理をしてからデータベースに格納するようにできる

というかrails g scaffoldのコマンドを使う必要もありません。routes.rbにルーティングを記述し、該当するコントローラとアクションに自分がさせたい処理を書くだけです！

# ソースコード
https://github.com/ruemura3/RailsApi

# さいごに
Ruby on Railsで作ったAPIの中身を解説しました。非常にシンプルな作りだったためわかりやすかったかと思います。

作りは違いますが、どの言語やフレームワークでも基本的には同じです。あなたの独自のAPIを作ってみましょう！ランダムに運勢をjsonで返すAPIとか。