この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。
既存のRailsアプリにJSONを返すAPIを追加する
Gem
jbuilderというjsonをいい感じにrubyで書けるGemを使用する。 jbuilderの使い方は以下の記事がわかりやすかった。 Railsのjbuilderの書き方と便利なイディオムやメソッド
gem 'jbuilder', '~> 2.5'
bundle installを入力して、gemをインストール
ルーティング
namespace :api, { format: 'json' } do namespace :v1 do # バージョン1を表している resources :users end end
$ rails routes api_v1_users GET /api/v1/users(.:format) api/v1/users#index {:format=>/json/} POST /api/v1/users(.:format) api/v1/users#create {:format=>/json/} new_api_v1_user GET /api/v1/users/new(.:format) api/v1/users#new {:format=>/json/} edit_api_v1_user GET /api/v1/users/:id/edit(.:format) api/v1/users#edit {:format=>/json/} api_v1_user GET /api/v1/users/:id(.:format) api/v1/users#show {:format=>/json/} PATCH /api/v1/users/:id(.:format) api/v1/users#update {:format=>/json/} PUT /api/v1/users/:id(.:format) api/v1/users#update {:format=>/json/} DELETE /api/v1/users/:id(.:format) api/v1/users#destroy {:format=>/json/}
namespaceを用いることで、普通のコントローラーとAPI用のコントローラーで分けている。
class Api::V1::UsersController < ApplicationController def index @users = User.all end def show @user = User.find(params[:id]) end end
json.array! @users, :name, :age, :gender, :area_id, :home_gelaende, :image, :self_introduction, :comment_count
json.user_data do json.user @user, :name, :age, :gender, :area_id, :home_gelaende, :image, :self_introduction, :comment_count json.comments do json.array! @user.comments, :park_id, :body, :like_count end end
ほぼテストデータのようなものしかないが、ターミナルでリクエストを投げると以下のようになる。
$ curl http://localhost:3000/api/v1/users [{"name":"Teruchika Matsubayashi","age":21,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":5},{"name":"Kento Okui","age":22,"gender":"male","area_id":2,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":4},{"name":"Shogo Uenishi","age":23,"gender":"female","area_id":3,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":4},{"name":"Yuta Okuno","age":24,"gender":"female","area_id":4,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":4},{"name":"Kotaro Adachi","age":21,"gender":"male","area_id":5,"home_gelaende":"aaa","image":{"url":"/uploads/user/image/5/20180405184255.jpg","thumb":{"url":"/uploads/user/image/5/thumb_20180405184255.jpg"}},"self_introduction":"aaa","comment_count":1},{"name":"井上 未来","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"井上 玲奈","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"松井 悠","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"小野 凛","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"松本 優","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"木村 綾乃","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"松井 七海","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"高田 颯","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"佐々木 茜","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"石川 一輝","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"近藤 空","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"西村 拓海","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"石井 陸","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0},{"name":"福田 大輝","age":20,"gender":"male","area_id":1,"home_gelaende":null,"image":{"url":null,"thumb":{"url":null}},"self_introduction":null,"comment_count":0}]
JSONが返ってきた。めでたい。