LoginSignup
1
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-16

はじめに

以前にこんな記事を投稿しました。
【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'は

  1. http://localhost:3000/users/ にGETリクエストを送ったときは(get 'users')
  2. 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とか。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3