【追記】とても微妙。要検証
言葉で説明しづらいので、例を示す。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
にしてルートに子ノードとして生やしているんだとイメージしてる)