ember-dataのREST APIでメタデータを扱う – Ember.js入門(20)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。 筆がのるときは連続投下です。 のらないときは沈黙しますが…

ついにEmber.js入門の連載が20回突破です! 今回はember-dataのREST APIにおけるメタデータの扱いについて説明します。

ember-dataを使ってモデルの一覧を取得する時、ページングなどを行いたい場合があります。 そのような場合は、クエリパラメータをREST APIに付与することができるため、ページ番号やソートキーなどをサーバに送信することができます。

// => http://ENDPOINT_URL/entry?page=3
this.store.find('entry', {
    page: 3
});

純粋なREST APIにクエリパラメータを持たせることが、良いかどうかの議論には興味がありませんが、現実としてはクエリパラメータを必要とするシーンは多いでしょう。 このようなAPIを使う場合、取得できるモデル情報に加えて、総件数やページ毎の件数といったメタデータも一緒に返したい場合があります。

レスポンスJSONにメタデータを付与する

メタデータはレスポンスJSONに付与することで、クライアントプログラムから参照できるようになります。 自由な形式で記述してもカスタマイズすれば取得できますが、デフォルトのフォーマットは次のようにmetaというキーでオブジェクトを構成します。

{
  'entries': [
  {
    id: 1,
    title: 'お知らせ1',
    content: 'お知らせです。',
    category: 1
  },
  {
    id: 2,
    title: 'お知らせ2',
    content: 'お知らせです。',
    category: 1
  }
  ],
  "meta": {
    "total": 120,
    "page": 1
  }
}

なお、これは言い換えると、metaという名前のモデルを定義すると命名規約的に被ってしまうため、挙動もあやしくなるということを意味します。 Ember.jsは暗黙のルールが多いフレームワークですので、この手の嵌まり所は嵌まって覚えるしかないと思います。

メタデータを取得する

プログラムでメタデータを取得するには、storeオブジェクトのmetadataForメソッドを利用します。

var meta = this.store.metadataFor("entry");

このようにすることで、検索クエリなどを扱った場合に、総件数などのメタデータがクライアントサイドで扱えます。