Skip to content

Latest commit

 

History

History
61 lines (43 loc) · 4.17 KB

Sync.md

File metadata and controls

61 lines (43 loc) · 4.17 KB

Backbone.Sync 原文

Backbone.syncは、サーバへmodelの保存や読込みを試みるたびにBackboneが呼び出す関数です。 初期設定では、RESTful JSON リクエストを行うために(jQueryもしくはZeptoの) .ajax を使用します。そして、レスポンスはjqXHRが返ります。 WebSockets、 XML transport、 Local Storageなどの異なる永続化の方法を利用する場合はこの関数を置き換えることができます。

Backbone.sync のメソッドシグネイチャは sync(method, model, [options]) です。

  • method – CRUDメソッド ("create", "read", "update", or "delete")
  • model – 保存するModel (もしくは、読込むcollection)
  • options – 成功か失敗した場合のコールバック、および他のすべてのjQuery(Ajax)オプション

Backbone.sync の既定の動作。 modelを保存する場合、modelの属性値はJSONにシリアライズされてHTTPボディに渡され、コンテントタイプに application/json を指定して送信します。 そしてサーバによって変更され、クライアントにて更新が必要なmodelの属性値は、JSONでレスポンスが返ります。 コレクションの "read" (#Collection#fetch) を使用した場合、複数のmodelオブジェクトが配列となってレスポンスが返されます。

この sync メソッドは、Backboneのコレクションや個々のモデルに sync 関数を追加することによって、 Backbone.sync と同じグローバルレベルやもっと細かい粒度でオーバーライドできます。

既定の sync が取り扱うCRUDをRESTに置き換えるマップ。

  • create → POST   /collection
  • read → GET   /collection[/id]
  • update → PUT   /collection/id
  • delete → DELETE   /collection/id

例として、Backbone から呼び出す "update" へのRailsの応答ハンドラはこのようになります。 (実際のコードでは update_attributes を盲目的に利用することはなく、常に変更できる属性をホワイトリスト化してください。)

def update
  account = Account.find params[:id]
  account.update_attributes params
  render :json => account
end

Railsと統合するためのもうひとつのヒントは、モデルからの to_jsonは 呼び出しについて 既定の名前空間を無効に設定することです。 ActiveRecord::Base.include_root_in_json = false

emulateHTTP Backbone.emulateHTTP = true 原文

もしBackbone既定のREST/HTTPアプローチをサポートしていないレガシーなWebサーバ上で作業したい場合、Backbone.emulateHTTPをオンにしてください。 この関数にtrueを設定して PUTDELETE リクエストを要求した場合、X-HTTP-Method-Override HTTPリクエストヘッダーを POST に偽装してリクエストを要求します。 また、emulateJSON メソッドをtrueにした場合、この設定は _method パラメータとして渡されます。

Backbone.emulateHTTP = true;

model.save();  // "_method=PUT" パラメータと一緒に "/collection/id" へ POSTする。

emulateJSON Backbone.emulateJSON = true 原文

もし application/json エンコードを取り扱えないレガシーなWebサーバ上で作業している場合、 Backbone.emulateJSON = true; とすることで、JSONは model パラメータとしてシリアライズされ HTMLフォームと同じようにMINEタイプを application/x-www-form-urlencoded としてリクエストを要求します。