0

我有一个绑定到 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 的 index 操作返回的初始模型哈希的结构和它的 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)
4

1 回答 1

0

原来问题出在 API 的模型序列化上。我没有连接 Active Model Serializer 来以 Ember 预期的方式序列化模型。

我正在返回格式的 JSON:

{name:"", body:""}

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

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

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

于 2013-03-25T15:46:00.817 回答