Rest 使用对象数组获取余烬数据

Rest 使用对象数组获取余烬数据,rest,ember.js,ember-data,Rest,Ember.js,Ember Data,我有一个简单的余烬数据应用程序来列出和显示各种对象 例如,My/servers.json API返回这种格式: [ { "hosted_domain" : "example.com", "status" : 1, "name" : "srv0443", "id" : 443 }, { "id" : 392, "status" : 1, "name" : "srv0392", "hos

我有一个简单的余烬数据应用程序来列出和显示各种对象

例如,My/servers.json API返回这种格式:

[
   {
      "hosted_domain" : "example.com",
      "status" : 1,
      "name" : "srv0443",
      "id" : 443
   },
   {
      "id" : 392,
      "status" : 1,
      "name" : "srv0392",
      "hosted_domain" : "example.com"
   },
   {
      "hosted_domain" : "example.com",
      "id" : 419,
      "name" : "srv0419",
      "status" : 1
   }
]
{
   "servers" : [
      {
         "name" : "srv0443",
         "status" : 1,
         "id" : 443,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0392",
         "id" : 392,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0419",
         "hosted_domain" : "example.com",
         "id" : 419
      },
  ]
}
但我得到了以下错误:

Assertion Failed: The response from a findAll must be an Array, not undefined
余烬数据需要这种格式:

[
   {
      "hosted_domain" : "example.com",
      "status" : 1,
      "name" : "srv0443",
      "id" : 443
   },
   {
      "id" : 392,
      "status" : 1,
      "name" : "srv0392",
      "hosted_domain" : "example.com"
   },
   {
      "hosted_domain" : "example.com",
      "id" : 419,
      "name" : "srv0419",
      "status" : 1
   }
]
{
   "servers" : [
      {
         "name" : "srv0443",
         "status" : 1,
         "id" : 443,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0392",
         "id" : 392,
         "hosted_domain" : "example.com"
      },
      {
         "status" : 1,
         "name" : "srv0419",
         "hosted_domain" : "example.com",
         "id" : 419
      },
  ]
}
我知道我可以用RESTSerializer的

它是通过执行payload={servers:payload}来工作的,但是如何让它以一种通用的方式工作呢

如何捕获模型类型所需的键

一般来说,按照惯例,什么是良好的REST格式


谢谢。

余烬数据的工作原理是让数据遵循某种约定{servers:payload}。因此,数据要么需要一致,要么必须像前面提到的那样扩展序列化程序,要么进行其他定制,比如重写模型的findAll方法。如果您想使用余烬数据,它周围就没有任何东西。当然,您不必使用余烬数据。下面是一篇关于不使用它的好文章:

要自定义序列化程序,可以按如下方式对其进行扩展: App.ServerSerializer=DS.RESTSerializer.extend{ extractArray:functionstore,类型,有效负载{ 这个._superstore,类型,{servers:payload}; }, };


提取数组在从服务器获得响应后由ember自动调用。这将采用余烬数据所期望的格式,然后将其传递到继续处理。但对于每种类型的模型,您都必须这样做。如果您替代App.ApplicationSerializer,您可能可以使用类型参数来确定修改后的有效负载中应该包含哪个键,因此它适用于任何模型,但我现在无法检查它。

最终通过在RESTSerializer上使用primaryType.typeKey和工具找到了解决方案:

App.ApplicationSerializer = DS.RESTSerializer.extend
  extractArray: (store, primaryType, payload) ->
    # Payload reload with { type.pluralize: hash }
    payloadKey = Ember.Inflector.inflector.pluralize primaryType.typeKey
    payloadReloaded = []
    payloadReloaded[payloadKey] = payload

    @_super store, primaryType, payloadReloaded
简言之:

获取类型密钥,例如服务器 使it多元化,例如服务器 将其添加为有效负载主密钥,例如{servers:payload} 就这样


如果您有更好的建议,请随时评论此解决方案。

谢谢您的帮助和链接。但我的问题恰恰是如何覆盖序列化程序以使用返回的数据对其进行调整。哦,好吧,我以为您在试图避免这样做。我编辑了答案以包括如何做到这一点。是的,我知道这个解决方案,但它是针对服务器型号的。我有几十个模型和控制器,覆盖每一个都会很痛苦。我正在寻找一种通用的方法,在这种情况下获得所需的关键服务器。你收到了吗?谢谢你的帮助。