Ember : 1.13.3
Ember Data : 1.13.5
jQuery : 1.11.3
EmberJS クライアントからサーバーに ember-data を使用して JSON ペイロードを送信しようとしています。複数のリクエストを送信したくないので、プロジェクトの保存時にオブジェクト グラフ全体をサーバーに送信したいと考えています。複数のリクエストを送っても構わないのですが、途中でひとつのリクエストが失敗し、サーバー上のデータが正しくない場合はどうなるか心配です。
JSONAPI ( http://jsonapi.org/format/#document-compound-documents ) が Ember のデフォルトのアダプターになりつつあるため、使用したいと思いました。また、この形式を扱う C# ライブラリがいくつかあるので、非常に簡単だと思いました。しかし、仕様を読んだ後、ID がないとオブジェクトを埋め込むことができないようです。DS.attr で指定したにもかかわらず、EmberJS も子オブジェクトを JSON にアタッチしません{ async: false, embedded: 'always' })
。
私の質問は、オブジェクト グラフがクライアント側で作成されるような方法でアプリケーションが使用されている場合、JSONAPI 形式を使用してオブジェクト グラフ全体をサーバーに送信するにはどうすればよいですか? JSONAPI 標準を満たすために、クライアント側で ID を生成する必要がありますか? 次に、サーバーに到達したら無視するだけで、ORMによって生成されたIDで保存されますか?
ここに私の labelGroup モデルがあります:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
labels: DS.hasMany('label-model', { async: false, embedded: 'always' })
});
ここに私のプロジェクトモデルがあります:
import DS from 'ember-data';
export default DS.Model.extend(DS.EmbeddedRecordsMixin, {
name: DS.attr('string'),
labelGroups: DS.hasMany('labelGroup', { async: false, embedded: 'always'})
});
プロジェクトで save() を実行した後に取得する POST は次のとおりです。
{
"data":{
"attributes":{"name":"Project"},
"relationships":{
"label-groups":{
"data":[
{"type":"label-groups","id":null},
{"type":"label-groups","id":null},
{"type":"label-groups","id":null},
{"type":"label-groups","id":null},
{"type":"label-groups","id":null},
{"type":"label-groups","id":null},
{"type":"label-groups","id":null}
]
}
},
"type":"label-projects"
}
}
更新: https://www.npmjs.com/package/ember-cli-uuidを使用して、クライアント側の ID を生成しようとしました。ただし、出力を取得するデータには追加のオブジェクトは含まれず、それらの ID への参照のみが含まれます。http://jsonapi.org/format/#document-compound-documentsで指定されているように、「含まれる」プロパティが表示されることを期待していましたが、そこにはありません。
{
"data":{
"id":"7b4544ee-91cd-493d-8b10-52040e68c283",
"attributes":{"name":"Project"},
"relationships":{
"label-groups":{
"data":[
{"type":"label-groups","id":"08115273-e82a-4d46-93ea-232ce071fb78"},
{"type":"label-groups","id":"9ca94fe9-8077-411e-98d2-1694c6fecce4"},
{"type":"label-groups","id":"d629f1e8-7962-404d-8034-38229ab21f77"},
{"type":"label-groups","id":"c6bda655-5489-4760-847b-bf02239bb2c5"},
{"type":"label-groups","id":"f6fef249-2d1d-43f0-ba64-24b7ff8b5637"},
{"type":"label-groups","id":"a7db25bf-52c8-477b-83e4-64e7c76b072e"},
{"type":"label-groups","id":"f3b5fbb3-261a-4b3d-b481-b9352f8ce2d6"}
]
}
},
"type":"label-projects"
}
}