【Rails】JSONデータを返却する「gem jbuilder」の便利な使い方
こんにちは。opiyoです。
今回はJSONデータを作る際に便利な「gem jbuilder」についてです。
RailsはAPIに徹する事が世の中的に多くなってきてると思うので、JSONに接する機会は多いと思います。
そんな時に便利なjbuilder
の使い方について、実際のプログラムと共に紹介します。
こんな悩みを解決していければと思います。
gem jbuilderとは
json形式のデータを簡単に作る為のgemです。
json形式のデータを作るのに便利なgemは僕が知る限り2つあります。 - jbuilder - jb
jbuilder
の方がjsonの階層構造と同じようなイメージで作れるので非常に分かりやすい。
が、重たい。
jb
の方は逆で階層構造を自分の頭の中で組み立てて行くイメージになるので分かりづらい。
が、早い。
以前レスポンスをアップする為にjb
にチャレンジしたんだけど、ちょっと深い階層作ったりするのがどうしても出来なくて挫折した経験ありです...
gem jbuilderの基本的な使い方
では、早速色々な使い方をまとめていきたいと思います。
jbuilderのインストール
gem 'jbuilder'
基本の基本
json.hoge
で一番上の階層が作れる
json.total_pages @events.total_pages ↓ { "total_pages": 10 }
階層を下げるには?
do
を使ってブロックを作り、その中に値を書いてあげる
json.events do json.id 123 end ↓ "events": { "id": 123 }
複数件=配列の作り方
do
を使ってブロックを作りつつ、array!
でぐるぐる回すイメージ
json.events do json.array!(@events) do |event| json.id event.id end end ↓ "events": [ { "id": 1185, }, { "id": 1183, } ]
さらに深掘りするには?
これ以降は、上を組み合わせればok。
array!
の中で、do
を使えば更に深くなって行くよ
json.contents do json.array!(@items) do |t| json.id t.id // この部分だね json.title do json.label t.title end end end ↓ "contents": [ { "id": 1, "title": { "label": "テスト" } ]
gem jbuilderの便利なメソッド
extract!で簡単出力
showの時に使うことが多いかな。対象オブジェクトが1件の場合はextract!
を使って出力したいカラムをシンボルで渡してあげれば勝手にjson形式データを作っちゃうよ。
第一引数がオブジェクト、第二引数以降に出力したいカラム名をシンボルで。
json.extract! @item, :id, :title, :description, :created_at, :updated_at ↓ { "id": 1, "title": "テスト", "description": "てすと", "created_at": "2019-12-25T09:22:25.186Z", "updated_at": "2019-12-25T09:22:25.186Z" }
if文も使えちゃう!?
jbuilderの凄いところで、普通にif文とかインスタンスメソッドとか呼べちゃう!
if @event.image.present? json.image_url @event.resized_image_url json.width @event.image.width json.height @event.image.height end
json.finished @event.finished? class Event < ApplicationRecord def finished? return true if event_dates.blank? event_dates.last.date < Date.current end end
// array!はeachと同じように扱えるって思っておけばokだね! json.array!(events) do |event| if group_event == event next end json.id event.id end
ルーティングのprefixが使える
ページのURLを渡したい時はルーティングのprefixが使えちゃう。queryも付与できるからクソ便利だし、hoge_urlにしておけばrequest_urlからドメインも勝手に判断してくれる!
json.url event_url(public_id: @event.eventer.public_id, event_id: @event.id, utm_source: :test) ↓ // 勝手にlocalhost:3000を生成してくれる "url": "http://localhost:3000/events/1185?utm_source=test",
partialが使える
viewと同じようにpartial!が使えるので、共通化できる。 が、記憶が曖昧だけどpartialすると毎回renderされるので、件数が増えれば増えるだけ遅くなる。だから、partialせずに同ファイルに書いてしまった方がレスポンスは早くなる。
json.partial! 'cms_api/events/show', event: event
gem jbuilderのまとめ
様々なjsonデータの作り方について、まとめてみました。
自分が携わっているプロジェクトでは、あまり利用してないですが今どこ行ってもRails側はAPIだけで使う = jsonで返すだけ。って事が多いと思うのでjbuilderは使う場面がいっぱいあるのではないでしょうか? 僕も引き続き積極的に使っていきたいと思います!