【Rails】apiモードで簡単にREST APIを作ってみる

環境構築

apiモードでアプリを作成する

下記のように、–apiを末尾につけることで、APIにいらない部分を省いたAPIモードで作成できる。

$ rails new アプリ名 --api

$ rails new lotte --api #例

データベースを作成する

この状態ではまだ立ち上がらないので、以下のコマンドでデータベースを作成する。

$ rails db:create

ローカルで確かめる

以下のコマンドで、作成したアプリを立ち上げる。

$ rails s

うまく行ったら、 http://localhost:3000/ にアクセスして確かめる。

このような画面になれば、環境構築は無事成功。

REST API作成

モデル、コントローラーを作成する

今回は、string型のnameカラムを持ったmemberテーブルを作成する。

$ rails g model member name:string
$ rails g controller members

成功したら以下のコマンドで反映させる。

$ rails db:migrate

apiモードで作成すると、api作成に特化しているので、railsにおけるMVCのviewが省かれている

実際にコードを見てみると、viewは作成されていないのがわかる。

ルーティング設定

WebAPIは、バージョン管理が重要なので、以下のようにnamespaceを使って記述すると、今後のAPIバージョン管理が楽になる。「v1」はversion1の略。

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :members
    end
  end
end

ルートはこちら(rails routes)↓

api_v1_members GET    /api/v1/members(.:format)         api/v1/members#index
               POST   /api/v1/members(.:format)         api/v1/members#create
api_v1_member  GET    /api/v1/members/:id(.:format)     api/v1/members#show
               PATCH  /api/v1/members/:id(.:format)     api/v1/members#update
               PUT    /api/v1/members/:id(.:format)     api/v1/members#update
               DELETE /api/v1/members/:id(.:format)     api/v1/members#destroy

コントローラーの設定

上記のルートで設定したように、api、v1のディレクトリを以下の構図のように作成する。

---- controllers

      --- api

        -- v1

         - members_controller.rb

*上記のように、apiの中にv1、v1の中にmembers_controller.rb、この構図を守らないとRoutingErrorが発生するので注意。

コントローラーの中身は、作成・取得・削除・編集ができるように設定する。

module Api
    module V1
      class MembersController < ApplicationController
        before_action :set_member, only: [:show, :update, :destroy]
  
        def index
          members = Member.order(created_at: :desc)
          render json: { 
            status: 'SUCCESS', 
            message: 'Loaded members', 
            data: members 
          }
        end
  
        def show
          render json: { 
            status: 'SUCCESS', 
            message: 'Loaded the member', 
            data: @member 
          }
        end
  
        def create
          member = Member.new(name: params[:name])
          if member.save
            render json: { 
              status: 'SUCCESS', 
              data: member 
            }
          else
            render json: { 
              status: 'ERROR', 
              data: member.errors 
            }
          end
        end
  
        def destroy
          @member.destroy
          render json: { 
            status: 'SUCCESS', 
            message: 'Deleted the member', 
            data: @member 
          }
        end
  
        def update
          if @member.update(name: params[:name])
            render json: { 
              status: 'SUCCESS', 
              message: 'Updated the member', 
              data: @member 
            }
          else
            render json: { 
              status: 'SUCCESS', 
              message: 'Not updated', 
              data: @member.errors 
            }
          end
        end
  
        private
  
        def set_member
          @member = Member.find_by(id: params[:id])
        end
      end
    end
  end

postmanで動作確認

まずはrails cでサンプルのデータを作る。

$ rails c

irb(main):001:0> Member.create(name:'ogino')
irb(main):002:0> Member.create(name:'fujiwara')
irb(main):003:0> Member.create(name:'asakura')
irb(main):004:0> Member.create(name:'kato')

railsを立ち上げる。

$ rails s

postmanで動作確認

GET(index)http://localhost:3000/api/v1/members

GET(show)http://localhost:3000/api/v1/members/:id

特定のidを取得する。

POST(create)http://localhost:3000/api/v1/members

JSON形式でデータを新しく作る。

まずはurlを入力する左側で、GETからPOSTに変える。また、下の選択肢のBodyとrawを選択する。

PUT(update)http://localhost:3000/api/v1/members/:id

データをアップデートする時は、PUTで叩く。

選択肢からPUTを選択して動作を確認する。

“yasuda” → “iguchi”

DELETE(destroy)http://localhost:3000/api/v1/members/:id

データを削除したい場合は、DELETEで叩く。

DELETEを選択して、データを削除する動作を確認する。

タイトルとURLをコピーしました