在新创建的模型哈希中缺少烬数据映射

Ember Data Mapping Missing In Newly Created Model Hash

本文关键字:哈希中 映射 数据 模型 新创建 创建      更新时间:2023-09-26

我有一个绑定到Rails API的Ember应用程序。

我的模型是这样定义的:

NewsCMS.NewsItem = DS.Model.extend({
  title: DS.attr('string'),
  date: DS.attr('date'),
  body_html: DS.attr('string')
});

当应用程序启动时,它成功地拉入当前模型并显示它们,然而,当我创建一个新的NewsItem,并且该项目从API返回时,我得到一个错误:

未捕获错误:断言失败:您的服务器返回了带有键body_html,但没有映射

模型被成功地持久化到Rails API,所以问题肯定在于新创建对象的反序列化,但是使用了断点。

如果我比较rails API的索引操作返回的初始模型哈希值的结构和它的创建操作返回的单个模型哈希值的结构,它们是相同的,那么为什么Ember阻塞在新创建的模型上,而处理初始的、持久化的模型却没有问题呢?

查看异常的来源,我可以看到它在这里:

if (!sideloadedType) {
        sideloadedType = this.sideloadMapping.get(prop);
        if (typeof sideloadedType === 'string') {
          sideloadedType = get(Ember.lookup, sideloadedType);
        }
        Ember.assert("Your server returned a hash with the key " + prop + " but you have no mapping for it", !!sideloadedType);
      }

堆栈是这样的:

Ember.assert (ember.js:52)
DS.JSONSerializer.DS.Serializer.extend.sideload (ember-data.js:6482)
DS.JSONSerializer.DS.Serializer.extend.extract (ember-data.js:6424)
superWrapper (ember.js:946)
DS.Adapter.Ember.Object.extend.didCreateRecord (ember-data.js:6730)
DS.RESTAdapter.DS.Adapter.extend.createRecord.ajax.success (ember-data.js:7625)
RunLoop._prev (ember.js:4156)
Ember.handleErrors (ember.js:410)
invoke (ember.js:4154)
tryable (ember.js:4343)
Ember.tryFinally (ember.js:1101)
Ember.run (ember.js:4347)
DS.RESTAdapter.DS.Adapter.extend.createRecord.ajax.success (ember-data.js:7624)
jQuery.Callbacks.fire (jquery.js:1038)
jQuery.Callbacks.self.fireWith (jquery.js:1149)
done (jquery.js:8075)
jQuery.ajaxTransport.send.callback (jquery.js:8599)

问题出在API对模型的序列化上。我没有连接一个活动模型序列化器,以Ember期望的方式序列化模型。

我返回的是JSON格式:

{name:"", body:""}

当它需要看起来像这样时:

[
 { news_item: {
    name: "",
    body: ""}
 }
]

所以Ember将它命中的第一个属性视为描述它将要反序列化的模型类型的键。当它检查如何处理这个模型时,它找不到任何映射到它的东西(因为它是一个模型的属性,而不是模型本身)。