おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【Rails】JSONデータを返却する「gem jbuilder」の便利な使い方

こんにちは。opiyoです。

今回はJSONデータを作る際に便利な「gem jbuilder」についてです。 RailsAPIに徹する事が世の中的に多くなってきてると思うので、JSONに接する機会は多いと思います。 そんな時に便利なjbuilderの使い方について、実際のプログラムと共に紹介します。

  • jbuilderって何!?
  • jbuilder使うと、どんなことが出来るの?
  • 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は使う場面がいっぱいあるのではないでしょうか? 僕も引き続き積極的に使っていきたいと思います!