我有一个简单的模型,并使用RESTadapter来获取数据。执行JSON请求,但后来我收到以下错误:“您的服务器返回了一个带有键0的哈希,但您没有映射它”
知道原因是什么吗?
型号:
App.Article = DS.Model.extend({
title: DS.attr('string')
});
请求文章的JSON响应.json:
[
{
"id": 1,
"title": "Title 1"
},
{
"id": 2,
"title": "Title 2"
}
]
我认为原因是回复的格式......我已经改变了我的回复以包含“文章”,但是仍然存在同样的问题。
[
{
"article": {
"id": 1,
"title": "Title 1"
}
},
{
"article": {
"id": 2,
"title": "Title 2"
}
}
]
我在哪里可以找到关于如何格式化JSOn请求和响应以用于RESTadapter的良好文档?
答案 0 :(得分:4)
您正在寻找的JSON应该有一个根元素
{"articles": [
{
"id": 1,
"title": "Title 1"
},
{
"id": 2,
"title": "Title 2"
}
]
}
中找到文档
答案 1 :(得分:2)
@kiwiupover 98%是正确的,当有多个记录时,它应该复数为articles
:
{"articles": [
{
"id": 1,
"title": "Title 1"
},
{
"id": 2,
"title": "Title 2"
}
]}
答案 2 :(得分:1)
如果您无法访问服务器,则很容易修改适配器。对于“GET”请求,您需要覆盖适配器中的find
和findAll
:
App.Store = DS.Store.extend({
adapter: DS.RESTAdapter.create({
find: function(store, type, id) {
var root = this.rootForType(type), adapter = this;
return this.ajax(this.buildURL(root, id), "GET").
then(function(json){
var updatedJSON = {};
updatedJSON[root] = json;
adapter.didFindRecord(store, type, {article: json}, id);
}).then(null, DS.rejectionHandler);
},
findAll: function(store, type, since) {
var root, adapter;
root = this.rootForType(type);
adapter = this;
var resourceName = this.pluralize(root);
return this.ajax(this.buildURL(root), "GET",{
data: this.sinceQuery(since)
}).then(function(json) {
var updatedJSON = {};
updatedJSON[resourceName] = json;
adapter.didFindAll(store, type, updatedJSON);
}).then(null, DS.rejectionHandler);
}
})
});
目前,这些功能存在于源代码here in rest_adapter.js中。
这里的区别在于每个函数中定义updatedJSON
的位置。它从服务器获取json并构造一个新对象(希望)你需要的正确密钥。