2013年7月11日木曜日

Backbone.js の sync() ではデータに id を付けるのはサーバの役割?

モデルに自動的に振られる cid をデータベース上の id として使おうとしていたら、
sync() の create でデータの id を指定できなかったという話です。


Backbone.sync() 

Backbone.js では sync() 関数を使ってブラウザ上のデータと
サーバ上のデータベースを ajax によって同期させることができます。

モデルの中で urlRoot を指定しておけば、
それを基準にした URL へリクエストが投げられます。

例えばブラウザ上で作成しているゲームをサーバへ同期させるために、
以下のように指定したとします。
/**
 * ゲームモデル
 */
var Game = Backbone.Model.extend({
    urlRoot: '/sync/game',
    defaults: {
        name: '',
        description: '',
        thumbnail: '',
        firstScene: null,
        sceneList: null
    },
    initialize: function() {
        this.set('sceneList', new SceneList());
    }
});

そして sync() 関数を使ってサーバ上へデータを送ります。
この時、引数に create/read/update/delete のいずれかをセット出来ます。(いわゆるCRUD)
ここで指定した操作に合わせて、HTTP リクエストのメソッドが変わります。

    create   -> POST
    update -> PUT
    read     -> GET
    delete   -> DELETE

このとき、以下のようにリクエスト URL が決定します。

    create    -> /sync/game/
    update   -> /sync/game/id
    read       -> /sync/game[/id]
    delete     -> /sync/game/id

update や delete ではモデルの id が自動的に URL へ付加されます。
サーバ側でこの id に対応するデータを削除すればOKです。

詳しくは公式ドキュメントを参照してください。

    Sync - Backbone.js
    http://backbonejs.org/#Sync

create に id がない

create ではまだデータベース上に存在しないデータを追加するので、
id はサーバ側で付けるということになっているようです。

ブラウザ上で新しいモデルを作成した時に、
自動的に付加される cid をデータベース上の idとして使おうと思っていたのですが、
create では id を指定できないのでサーバ側で付けるように変更する必要がありそうです。

クライアント id は複数のクライアント間で被ってしまう可能性があるから、
サーバ側で id を付けるようになっているんだと思います。

0 件のコメント:

コメントを投稿