2013-03-25 42 views
0

我有一个绑定到Rails API的Ember应用程序。Ember数据映射在新创建的模型哈希中丢失

我的模式是这样定义的:

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

当应用程序启动时,它成功地拉在当前的模型,并显示出来,但是当我创建一个新的NewsItem,和该项目从返回该API,我得到一个错误:

Uncaught Error: assertion failed: Your server returned a hash with the key body_html but you have no mapping for it

该模型成功坚持到Rails的API,所以问题肯定出在新创建的对象的deserialisation,但是使用断点。

如果我比较由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) 

回答

0

原来,问题是随着模型的API的系列化。我没有连接一个主动模型串行器来按照Ember预期的方式序列化模型。

我返回格式的JSON:

{name:"", body:""} 

当它需要像这样:

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

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

+0

我已经尝试了两种格式,仍然收到相同的错误fwiw – netpoetica 2013-05-01 17:42:02