【Rails】簡単API作成

以下の記事のAPIのみの設定の部分を参考にさせていただきました。

RailsでAPI作成とAPIのテストのまとめ - Rails Webook

ここでは、Uberみたいにドライバーを登録していくサービスのAPIを想定。Driverクラスってのを作ってます。

routes.rbに設定

config/routes.rbに以下のように記述します。

Rails.application.routes.draw do
  namespace :api, { format: 'json' } do
    resources :drivers
  end

  resources :drivers
  root to: 'drivers#index'
end

まず以下でDriverクラスに関するnamespaceを、formatをjsonに指定して作成します。

  namespace :api, { format: 'json' } do
    resources :drivers
  end

「namespace = 名前空間」とはファイル名を被らないようにだったり、属性によってクラスタリングするために使うための名前=パス、って解釈すれば大丈夫かな。以下あたりが参考になるかも

PHP: 名前空間の概要 - Manual

名前空間とは - はてなキーワード

Railsだとこれを使えばDriverクラスについて自動で別の名前空間を作成してくれるんだね、すばらしい。

$ rake routesでルーティングを確認してみると以下のように。

         Prefix Verb   URI Pattern                     Controller#Action
    api_drivers GET    /api/drivers(.:format)          api/drivers#index {:format=>"json"}
                POST   /api/drivers(.:format)          api/drivers#create {:format=>"json"}
 new_api_driver GET    /api/drivers/new(.:format)      api/drivers#new {:format=>"json"}
edit_api_driver GET    /api/drivers/:id/edit(.:format) api/drivers#edit {:format=>"json"}
     api_driver GET    /api/drivers/:id(.:format)      api/drivers#show {:format=>"json"}
                PATCH  /api/drivers/:id(.:format)      api/drivers#update {:format=>"json"}
                PUT    /api/drivers/:id(.:format)      api/drivers#update {:format=>"json"}
                DELETE /api/drivers/:id(.:format)      api/drivers#destroy {:format=>"json"}
        drivers GET    /drivers(.:format)              drivers#index
                POST   /drivers(.:format)              drivers#create
     new_driver GET    /drivers/new(.:format)          drivers#new
    edit_driver GET    /drivers/:id/edit(.:format)     drivers#edit
         driver GET    /drivers/:id(.:format)          drivers#show
                PATCH  /drivers/:id(.:format)          drivers#update
                PUT    /drivers/:id(.:format)          drivers#update
                DELETE /drivers/:id(.:format)          drivers#destroy
           root GET    /                               drivers#index

おお、すげー。

これでコントローラを定義すれば完成。

ここではapi/drivers#indexの定義をまずする。

注意したいのは名前空間を設定したので、コントローラはapiディレクトリ中にあるものを編集するということ。つまりapp/controllers/api/drivers_controller.rbを作成しないといけない。あと、module Apiの中に書かなければいけないということ。

module Api
  class ProductsController < ApplicationController
    def index
      @drivers = Driver.all
      render json: @drivers
    end
  end
end

これでとりあえず動く。$ rails sWEBrickを立ち上げて、http://localhost:3000/api/driversとかにアクセスすると、

[{"id":1,"name":"Yuta","review":4,"phone":"xxxxxxxxxxx","comment":"This is a comment","created_at":"2015-03-08T18:31:07.846Z","updated_at":"2015-03-08T18:31:07.846Z"},{"id":2,"name":"Totz","review":2,"phone":"xxxxxxxxxxx","comment":"This is a second driver","created_at":"2015-03-10T00:50:27.366Z","updated_at":"2015-03-10T00:50:27.366Z"}]

みたいにブラウザに表示されます。簡単!