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の項目から消して欲しいなど、出力するカラムの選択ができる
- 特定の条件の時だけ表示形式を変えたい(日付表示に関して割りとよくある要望)
- キャッシュしておく仕組みが無い
ということでとても融通が利きそう!
参照元記事: