2013-03-04 26 views
7

を使用した場合、POSTの代わりに、更新のPUTが、私は私のモデルで複合キーを使用して、私の複合キーに基づいてIDを生成していません代入の新しい、私はAPIからそれらをフェッチするときに解析メソッドでIDを設定していますが、新しいです。その結果、バックボーンはDELETEを実行せず、アップデート時にPUTの代わりにPOSTを行います。これを回避するにはどうすればよいですか、それを行う「正しい方法」は何ですか?バックボーンは複合キーが

更新:

this.idでresp.idを交換しても問題が解決したように見えます。 Backbone.Modelのparse方法の

+1

バックボーンはコンポジットキーをサポートしていないため、 'idAttribute'を配列として定義すると有効ではありません。すべてのモデルには1つのidフィールドが必要です。あなたのリソースURLはどのように見えますか? – jevakallio

+0

複合キーをサポートしています:https://github.com/documentcloud/backbone/pull/1558実際に私はthis.id = ...の代わりにresp.ide = ...の代わりにそれを解決しました。 –

+5

https://github.com/caseywebdev/backbone-composite-keysを使用してください。その質問に言及するのは理にかなったでしょうか。 – jevakallio

答えて

2

結果を属性モデルのを設定setメソッドに渡されます。あなたの混乱のポイントは、モデルのIDがその属性の1つではないということです。 のプロパティの1つで、です。

だから、何が起こることはこれです:

  1. あなたの生データは、サーバーから戻ってくると、今id属性で増補同じ生データは、set
  2. に渡されること parse
  3. に渡され、
  4. setルックスとあなたのidAttribute[ 'personId', 'jobId' ])と
  5. 生データのキーのすべてのこれらのキーのいずれもidAttributeと一致していないので、n個そのうちの1つがモデルのIDとして使用されるため、問題が発生します。

this.idparse内部の作品を設定するあなたのソリューションが、解析は、一般的にモデル自体は変更しないように、それの入力(生データ)上で動作するように設計されているので、それは道の下の問題を引き起こす可能性があります。その部分はsetが呼び出されたときに次に起こるはずです。クリーナー解決策ではなく、次のような何かをすることです:

app.Assignment = Backbone.Model.extend({ 
    // note that no idAttribute is specified, leaving it as the default "id" 
    parse : function(resp) { 
     resp.id = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 

それとも、あなたは常に強制することができさておき、ここidAttributeの問題から、あなたが別のID属性をしたい場合は...

app.Assignment = Backbone.Model.extend({ 
    idAttribute: 'personAndJobId', 
    parse : function(resp) { 
     resp.personAndJobId = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 
0

、バックボーンは、save()に渡されるタイプオプションを使用して特定のHTTPメソッドを使用します。

model.save(null, { type: 'put' })

0

私はバックボーンにおける複合IDで動作したことがありませんが、私は、これは簡単な問題への答えかもしれないと思う:あなたはあなたのバックボーンモデル定義では、このコードで

initialize: function() { 
     this.set("id", this.generateID()); 
}, 
generateID = function() { 
    return this.personId + + "_" + this.jobId; 
} 

モデルごとに固有のIDを作成し、更新に問題はなく、保存してください(idAttributeを設定する必要はありません)。