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