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を生成する際には積極的に使っていきたいと感じました。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (8件) を見る