サーバーの応答が投稿できるものとまったく異なるという、まったく同じ問題に遭遇しました。Backbone.sync オブジェクトの仕組みの中で、Backbone.sync の次のステートメントでカスタム JSON オブジェクトをサーバーにポストできる方法を発見しました。
if (!options.data && model && (method == 'create' || method == 'update')) {
params.contentType = 'application/json';
params.data = JSON.stringify(model.toJSON());
}
sync は、options.data が存在しないかどうかを評価し、params.data を文字列化されたモデルに設定します。options.data チェックは私を締め出しました。それが存在する場合、同期はモデルの代わりにそれを使用します。これを踏まえて、model.save を上書きして、サーバーが期待する属性ハッシュを渡すことができるようにしました。
これが私がそれを上書きした方法です:
save : function(key, value, options) {
var attributes = {}, opts = {};
//Need to use the same conditional that Backbone is using
//in its default save so that attributes and options
//are properly passed on to the prototype
if (_.isObject(key) || key == null) {
attributes = key;
opts = value;
} else {
attributes = {};
attributes[key] = value;
opts = options;
}
//In order to set .data to be used by Backbone.sync
//both opts and attributes must be defined
if (opts && attributes) {
opts.data = JSON.stringify(attributes);
opts.contentType = "application/json";
}
//Finally, make a call to the default save now that we've
//got all the details worked out.
return Backbone.Model.prototype.save.call(this, attributes, opts);
}
では、あなたの場合、これをどのように使用しますか?基本的に、マッピングを逆にして結果の JSON を返すメソッドを作成します。次に、次のようにビューまたはコントローラーから保存を呼び出すことができます。
getReversedMapping : function() {
ver reversedMap = {};
...
return reversedMap;
},
saveToServer : function() {
this._model.save(this.getReverseMapping, {
success : function(model, response) {
...
},
error : function(model, response) {
...
}
})
}
オーバーライドされた保存により、渡された JSON が options.data に自動的にコピーされるため、Backbone.sync はそれを使用して投稿します。