我正在尝试使用Ember Data的JSONAPIAdapter来处理嵌套资源。对于服务器部分,使用了django-rest-framework-json-api。
我的(简化)余烬模型:
case.js
DropDownList
comment.js
export default Model.extend({
firstName: attr('string'),
lastName: attr('string'),
comments: hasMany('comment'),
})
服务器对export default Model.extend({
text: attr('string'),
case: belongsTo('case'),
})
的回复如下:
/api/v1/cases/4
现在,如果我正确理解Ember Data和JSON-API规范,当我引用注释时,ember应该请求{
"data": [
{
"type": "cases",
"id": "4",
"attributes": {
"first-name": "Hans",
"last-name": "Peter",
},
"relationships": {
"comments": {
"meta": {
"count": 1
},
"data": [
{
"type": "comments",
"id": "5"
}
],
"links": {
"related": "http://localhost:8000/api/v1/cases/4/comments"
}
}
}
}
]
}
。相反,它会请求/api/v1/cases/4/comments
,这显然会返回/api/v1/comments/5
。
总结我的问题:
我正在使用ember v2.8。
奖金问题:我在创建新评论时面临同样的问题 - 如何将404
改为POST
而不是/case/4/comments
?
答案 0 :(得分:1)
JSON API规范不强制执行任何特定的网址格式,因此您尝试执行的操作符合规定。但是,我发现使用Ember Data可以更轻松地使用平面URL结构,但有一种解决方法。
您希望查看ember-data-url-templates插件,并将其中的一些逻辑添加到您的型号适配器。
使用该插件,您可以使用app/adapters/comment.js
:
import ApplicationAdapter from './application';
import UrlTemplates from 'ember-data-url-templates';
export default ApplicationAdapter.extend(UrlTemplates, {
namespace: 'api/v1', // You may or may not need this namespace setting:
// I'm a little rusty in this area :)
urlTemplate: '{+host}/case/{caseId}/comments{/id}',
urlSegments: {
contentId: function(type, id, snapshot/*, query */) {
return snapshot.belongsTo('case', { id: true });
}
}
});
除非插件允许解决此问题,否则我会相信这会阻止您进入整个应用中的评论的URL结构。因此,在决定沿着这条路走下去之前,一定要权衡这种权衡。
答案 1 :(得分:1)
是的,这可以设置如下
模型/ client.js
set CONDA_FORCE_32BIT=
模型/ client.js
export default DS.Model.extend({
name: DS.attr('string'),
telno: DS.attr('string'),
campaigns: hasMany()
});
/templates/client/edit.bhs
export default DS.Model.extend({
name: DS.attr('string'),
startdate: DS.attr('date'),
enddate: DS.attr('date'),
client: DS.belongsTo('client')
});
http://localhost:3000/api/clients/1
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th></th>
<th>Name</th>
</tr>
</thead>
<tbody>
{{#each model.campaigns as |campaign|}}
<tr>
<td>{{campaign.name}}</td>
</tr>
{{/each}}
</tbody>
</table>
http://localhost:3000/api/clients/1/campaigns
{
{
"links": {
"self": "http://localhost:3000/api/clients/1"
},
"data": {
"type": "clients",
"relationships": {
"campaigns": {
"links": {
"related": "http://localhost:3000/api/clients/1/campaigns"
}
}
},
"id": "1",
"attributes": {
"name": "Test",
"telno": "123"
},
"links": {
"self": "http://localhost:3000/api/clients/1"
}
}
}