2

我有一个简单的模型并使用 RESTadapter 来获取数据。JSON 请求已执行,但随后我收到以下错误:“您的服务器返回了一个带有密钥 0 的哈希,但您没有它的映射”

知道原因是什么吗?

模型:

App.Article = DS.Model.extend({
    title: DS.attr('string')
});

请求articles.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 一起使用的良好文档?

4

3 回答 3

4

您正在寻找的 JSON 应该有一个根元素

{"articles": [ 
  { 
    "id": 1,
    "title": "Title 1"
  },
  {
    "id": 2,
    "title": "Title 2"
   }
  ]
}

您可以在Ember Docs RESTAdapterJSONapi 项目中找到文档

于 2013-08-02T19:21:54.590 回答
2

@kiwiupover 98% 正确,当有多个记录时,它应该复数为articles

{"articles": [
     { 
       "id": 1,
       "title": "Title 1"
     },
     {
       "id": 2,
       "title": "Title 2"
     }
]}
于 2013-08-02T19:59:02.380 回答
1

如果您无权访问服务器,则修改适配器非常容易。对于“GET”请求,您需要覆盖findfindAll在您的适配器内:

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);
    }
  })
});

目前,这些函数位于 rest_adapter.js的源代码中。

这里的区别updatedJSON在于每个函数中定义的位置。它从服务器获取 json 并使用(希望)您需要的正确密钥构造一个新对象。

于 2013-08-30T01:50:34.990 回答