rablで各エンドポイントに共通のノードをルートに生やす
【追記】とても微妙。要検証
言葉で説明しづらいので、例を示す。APIが次のようなJSONを返すとする。
{
"note": {
"text": "補足情報"
},
"user": {
"id": ユーザのID,
"name": "ユーザー名"
}
}
ここで
"note"はAPIの各エンドポイントで共通のノードなので、extendsを使ってrablのテンプレートを共通化したい"user"の部分はエンドポイントによって異なる("users"だったり"books"だったり)ので、エンドポイントごとにテンプレートを作りたい
という要求が出てきた場合、次のように記述すればよい。
# エンドポイントごとのテンプレート # app/views/users/show.rabl extends "note", object: true object nil child @user do attributes :id, :name end
# 共通のテンプレート # app/views/_note.rabl child @note do attributes :text end
キモは
extendsの:objectオプションをtrueにすることobjectにはnilを宣言すること- 各ノードを生やすために
childを使うこと
の3つ。ちゃんとした理由はわかっていないけど、とりあえずこれで動く。
(objectを宣言すると、childはそれに対する子ノードを生成するので、nilにしてルートに子ノードとして生やしているんだとイメージしてる)