There's an echo in my head

日々のメモ。

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にしてルートに子ノードとして生やしているんだとイメージしてる)

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。