読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Rails4でJSONを作るならto_jsonよりjbuilder

jbuilderを使いはじめたのでメモ

jbuilderとは

jsonのテンプレートエンジンです。
xxx.json.jbuilderファイルにDSLを記述するとJSONにして返してくれるという物。
ファイルに記述するので難しいjson形式を返す時とかは便利そうです。
DHHが作ったもので、Rails4からはデフォルトで使えるようになっているようです。

jbuilderを使うための設定

Rails4では特に設定をせずに利用できます。

views以下にxxx.json.jbuilderファイルを作ってlocalhost:3000/items.jsonにアクセスすればjson形式のレスポンスが返ってくれます。

jbuilderの書き方

Modelを使わない書き方

一番シンプルな形式。

json.set! :key, 'value'

# {"key":"value"}

入れ子はこんな感じ。

json.set! :key1 do
  json.set! :key2, 'value'
end

# {"key1":{"key2":"value"}}

下のような書き方もできます

json.key1 do
  json.key2 "value"
end

# {"key1":{"key2":"value"}}

文字列以外の値も。

json.set! :key1 do
json.set! :key2, 'value'
json.set! :key3, 1
json.set! :key4, [1, 2, 3]
json.set! :key5, { a: 1, b: 2 }
json.set! :key6, nil
end

# {"key1":{"key2":"value","key3":1,"key4":[1,2,3],"key5":{"a":1,"b":2},"key6":null}}

2つ並行に書く事もできます。

json.set! :key1 do
  json.set! :key2, 'value'
end

json.set! :key3 do
  json.set! :key4, 'value'
end

# {"key1":{"key2":"value"},"key3":{"key4":"value"}}

キー名が被ると合成されます。

json.set! :key1 do
  json.set! :key2, 'value'
end

json.set! :key1 do
  json.set! :key4, 'value'
end

# {"key1":{"key2":"value","key4":"value"}}

Modelを使った書き方

カラム指定で吐き出す方法です。
.()って書き方は初めて見たかも。

json.(Item.first, :id, :created_at)

# {"id":1,"created_at":"2015-03-05T22:57:40.558Z"}

Modelの配列 (itemsをキーにした配列を持つhash) は下のように書けます。

json.items Item.all, :id, :created_at

# {"items":[{"id":1,"created_at":"2015-03-05T22:57:40.558Z"}]}

下のような書き方もできます。

json.items Item.all do |item|
  json.id item.id
  json.created_at item.created_at
end

# {"items":[{"id":1,"created_at":"2015-03-05T22:57:40.558Z"}]}

配列を返す場合は下のようになります。

json.array! Item.all do |item|
  json.id item.id
  json.created_at item.created_at
end

# [{"id":1,"created_at":"2015-03-05T05:57:40.558Z"}]

その他書き方

検証はしてないのですがRails.cacheを使ってくれるjson.cache!という書き方や部分テンプレートを使うjson.partial!もあるようです。
とても多機能でやりたい事はほとんどできそうな印象です。

まとめ

jbuilderは複雑なjsonの生成も見やすく書けるし、「Railsのバージョンによってmodelをto_jsonした時のキーの有り無しが違う」みたいな事故もなくて安心できそうです。
多少複雑なjsonを生成する際には積極的に使っていきたいと感じました。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails