はじめに
以前にこんな記事を投稿しました。
【3分で出来る】Ruby on RailsでWeb APIの作成
この記事で解説したように、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を試しましたが、以下の表を覚えていますでしょうか。
メソッド | パス 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にルーティングが記述されています。開いてみてみると以下のように記述されています。
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とはどういう意味でしょうか?
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'は
- http://localhost:3000/users/ にGETリクエストを送ったときは(get 'users')
- usersコントローラのindexアクションを実行しろ('users#index')
という意味です。
ではusersコントローラのindexアクションを見てみましょう。
コントローラとアクション
usersコントローラは/app/controllers/users_controller.rbにあります。
中を見てみるとindexメソッドが見つかると思います。これがindexアクションです。
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のコマンドに任せて作成した場合の話です。
メソッド | パス 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にルーティングを記述し、該当するコントローラとアクションに自分がさせたい処理を書くだけです!
ソースコード
さいごに
Ruby on Railsで作ったAPIの中身を解説しました。非常にシンプルな作りだったためわかりやすかったかと思います。
作りは違いますが、どの言語やフレームワークでも基本的には同じです。あなたの独自のAPIを作ってみましょう!ランダムに運勢をjsonで返すAPIとか。