[Rails] jbuilderでキー名だけ異なるjson arrayを生成する
jbuilderを使う際にプロパティAとプロパティBがあって、それらの中身が全部同じってことありませんか?
こんなイメージ
response: {
propertyA: [
{
key1: hoge,
key2: fuga
},
{
key1: hogehoge,
key2: fugafuga
},
...
]
propertyB: [
{
key1: piyo,
key2: bar
},
{
key1: piyopiyo,
key2: barbar
},
...
]
}
こういうときに、今までpartial
を2つ作ってたんですよね。
json.partial! 'child_partial/property_a', properties: properties_a
json.partial! 'child_partial/property_b', properties: properties_b
# child_partial/_property_a.json.jbuilder
json.propertyA properties_a.each |property_a| do
json.key1 property_a.value1 # 'hoge', 'hogehoge', ...
json.key2 property_a.value2 # 'fuga', 'fugafuga', ...
end
# child_partial/_property_b.json.jbuilder
json.propertyB properties_b.each |property_b| do
json.key1 property_b.value1 # 'piyo', 'piyopiyo', ...
json.key2 property_b.value2 # 'bar', 'barbar'
end
単にキー名が違うのにだけなのに、毎回ほとんど同じpartial
ファイルを作るの面倒だなーとは思って調べてみると、どうやら方法があるらしい。
それが set!
その方法が set!
を使う方法です。
json.set!
は、以下のように記述する事でキー名: value
がペアとなったJSON形式の文字列を返却します。
こんな感じで使用します。
json.set! "key_name", "hoge" # = json.key_name "hoge"
# {"キー名" :"hoge"}
json.set! “key_name”, “hoge” と json.key_name “hoge”の違い
これまで解説したjson.set!の箇所は、json.キー名を使った場合と同一の結果を得られていましたが、json.set!は、動的にキー名を定義する事が出来ます。
・json.set! - 動的にキー名を定義することが出来る
・json.キー名 - 動的にキー名を定義することが出来ない
例えば、インスタンス変数とeachメソッドを使って、以下のように記述することで動的にキー名を定義する事が出来ます。
set!
を使えば、partial
ファイルを呼び出す側でキー名を指定するだけで良くなるので、毎回ファイルを作ってしまう煩雑さから開放されます!
# child_partial/_property.json.jbuilder
key_name = :default_key_name if key_name.blank?
json.set! key_name do
json.array! properties.each do |property|
json.key1 property.value1
json.key2 property.value2
end
end
# partial/_child.json.jbuilder
# 親ファイルでキー名を指定する
json.partial! 'child_partial/property', properties: properties, key_name: :propertyA