我将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)
答案 0 :(得分:0)
原来问题在于API的模型序列化。我没有连接一个Active Model Serializer来按照Ember预期的方式序列化Model。
我正在返回格式的JSON:
{name:"", body:""}
如果需要这样:
[
{ news_item: {
name: "",
body: ""}
}
]
因此,Ember将其命中的第一个属性视为描述其即将反序列化的模型类型的键。当它检查如何处理这个模型时,它找不到映射到它的任何东西(因为它是Model的属性,而不是Model本身)。