新建模型哈希中缺少Ember数据映射

时间:2013-03-25 12:34:01

标签: javascript model ember.js deserialization ember-data

我将Ember应用绑定到Rails API。

我的模型定义如下:

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的索引操作返回的初始模型哈希的结构和它的create动作返回的单个模型哈希,它们是相同的,那么为什么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)

1 个答案:

答案 0 :(得分:0)

原来问题在于API的模型序列化。我没有连接一个Active Model Serializer来按照Ember预期的方式序列化Model。

我正在返回格式的JSON:

{name:"", body:""}

如果需要这样:

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

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