Kaorina’s diary

Ruby on Railsとかとか

Rails4以降でJSONデータを作る時にはjbuilderがお便利

jbuilderというjsonのテンプレートエンジンを使うと、viewディレクトリ以下にxxx.json.jbuilderファイルを作成し、localhost:3000/xxx.jsonとアクセスするだけでJSON形式のレスポンスを受け取ることができる。

app/views/api/index.json.jbuilder(今回はapiというnamespaceを切っている)

json.prefectures @prefectures do |prefecture| //コントローラー側でDBのデータを取得する@prefecturesを生成している
  json.id prefecture.id
  json.name prefecture.name
end


コントローラーをはさまなくでも直接モデルを参照する書き方ももちろんOK!

json.prefectures Prefecture.all do |prefecture| 
  json.id prefecture.id
  json.name prefecture.name
end


app/controllers/api/prefectures_controller.rb

class Api::PrefecturesController < Api::ApplicationController
  def index
     @prefectures = Prefecture.all
  end
end



これで http://localhost:3000/api/prefectures.json にアクセスすると下記のようなデータが取得できる

{"prefectures":[{"id":1,"name":"東京都"},{"id":2,"name":"埼玉県"},{"id":3,"name":"千葉県"}]}


また、アクセスするURLをjson形式にあらかじめ限定しておくとhttp://localhost:3000/api/prefecturesでアクセス可能

config/routes.rb

Rails.application.routes.draw do
  中略
  namespace :api, { format: 'json' } do
    resources :prefectures, only: [:index, :show]
  end
end



コントローラーのindexアクション内で render :json => オブジェクト とする場合もJSON形式のデータを取得できるが、jbuilderを使う場合がより便利なのは、、

  • updated_atだけで良いのでcreated_atはJSONの項目から消して欲しいなど、出力するカラムの選択ができる
  • 特定の条件の時だけ表示形式を変えたい(日付表示に関して割りとよくある要望)
  • キャッシュしておく仕組みが無い

ということでとても融通が利きそう!


参照元記事:

Rails4でJSONを作るならto_jsonよりjbuilder - しめ鯖日記