Rails
api
JSON
RubyOnRails
REST-API

RailsではじめてのRESTful API を作ってみた。

前提

REST(REpresentational State Transfer)の設計原則:airplane:

・リソースは一意に特定できる
・状態を持たない
・URLはリソースの複数形で表す
・URLは動詞を含めず、HTTPメソッドで操作を指定

RESTに基づいてHTTPメソッドでリソースをCRUD操作できる設計をRESTful とか言ったりする。

RESTful API !!

今回のデータの形式はJSONにしてますが

ちょっと前はXMLが主流だったそうです。
JSONってなにもの?

Rails5を使ってます。

Rails5でないと次に出てくるAPIモードを使えないので注意です。

作ってみよう

1. APIモードを使って新規作成

$ rails new driver_api --api

ディレクトリ移動します

$ cd driver_api

2. 運転手さんのModel、Controller作成

$ rails g scaffold drivers

「render json:」がたくさんあるdrivers_controller.rbができてます。

controllers/drivers_controller.rb
class DriversController < ApplicationController
  before_action :set_driver, only: [:show, :update, :destroy]

  # GET /drivers
  def index
    @drivers = Driver.all

    render json: @drivers
  end

  # GET /drivers/1
  def show
    render json: @driver
  end

  # POST /drivers
  def create
    @driver = Driver.new(driver_params)

    if @driver.save
      render json: @driver, status: :created, location: @driver
    else
      render json: @driver.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /drivers/1
  def update
    if @driver.update(driver_params)
      render json: @driver
    else
      render json: @driver.errors, status: :unprocessable_entity
    end
  end

  # DELETE /drivers/1
  def destroy
    @driver.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_driver
      @driver = Driver.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def driver_params
      params.fetch(:driver, {})
    end
end

3. カラムを追加

↓こんな感じにしましょう。

カラム データ型
driver_name String 運転手の名前
tel String 電話番号
car_number String 車両番号
$ rails g migration add_column_to_drivers

上記コマンドでmigrationファイルを作成し、下記add_columnのところを追記します。

db/migrate/xxxxxxxxxx_add_column_to_drivers.rb
class AddColumnToDrivers < ActiveRecord::Migration[5.1]
  def change
    add_column :drivers, :name, :string
    add_column :drivers, :tel, :string
    add_column :drivers, :car_number, :string
  end
end

4. マイグレーションを実行

$ rails db:migrate

5. 運転手データ(driver.csv)を、dbディレクトリに格納

データはこちらです。

6. db/seeds.rbを編集

db/seeds.rb
require 'csv'

CSV.foreach('db/driver.csv') do |row|
    Driver.create(:name => row[0],:tel => row[1],:car_number => row[2])
end

7. マイグレーションを実行

$ rails db:seed

⬆️db:seed なの要注意ですね。

実行してみると

下記コマンドでサーバー起動を実行して、

$ rails s

http://localhost:3000/drivers にアクセス。

運転手データがJSONで返ってくることが確認できる。
drivers_JSON.png

次回は外部からデータをPOSTしてみましょう。