部分页面加载然后空白,我收到以下错误。
TypeError: Cannot read property 'typeKey' of undefined
at Ember.Object.extend.modelFor (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:19:12298)
at Ember.Object.extend.recordForId (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:19:8860)
at s (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:19:1790)
at http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:19:1524
at http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:18:32392
at http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:9:22231
at Object.l.forEach (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:9:21553)
at Object.u.forEach (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:9:22198)
at Function.a.reopenClass.eachRelationship (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:18:32368)
at a (http://my-app.herokuapp.com/assets/manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:19:1302) manifest-docs-cbb67138a1a7e2bbc15fdbae9b24aa06.js:9n.function.n.apply.r
以下是我的模特:
# app/models/plan.js.coffee
App.Plan = DS.Model.extend
name: DS.attr('string')
slug: DS.attr('string')
project: DS.belongsTo('project')
sections: DS.hasMany('section',{async: true})
# app/models/section.js.coffee
App.Section = DS.Model.extend
name: DS.attr('string')
details: DS.attr('string')
sort_order: DS.attr('number')
plan: DS.belongsTo('plan')
summary_of_changes: DS.attr('string')
# app/models/project.js.coffee
App.Project = DS.Model.extend
name: DS.attr('string')
我正在跑步:
DEBUG: -------------------------------
DEBUG: Ember : 1.7.1+pre.c1ec09ad
DEBUG: Ember Data : 1.0.0-beta.9
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery : 1.10.2
DEBUG: -------------------------------
[编辑:添加项目模型代码] [编辑2:在这里找到关于ember论坛的相关讨论:http://discuss.emberjs.com/t/ember-data-dont-want-to-load-belongsto-relationship/5703/11]
答案 0 :(得分:6)
我得到了一些帮助,事实证明这确实是一个奇怪的错误。
首先,对于那些带着Ember + TypeKey问题来到这里的人。
我个人通过读取堆栈跟踪并查看“Object.l.forEach”并意识到该页面上只有一个forEach,设法将我的错误缩小到我的代码的这一部分。
{{#each section in model.sections}}
<h2>
{{section.name}}
{{link-to 'edit' 'section.edit' section classNames='edit'}}
</h2>
{{markdown section.details}}
{{/each}}
正如我所解释的那样,链接到帮助器传递一个对象,它上面应该是一个section对象。 Ember通过调用object.typeKey来询问对象的类型。但是在这种情况下,对象丢失了,所以我们得到的错误信息基本上是“我试图通过请求它的typeKey来查找对象的类型,但没有定义对象”。
解决这个问题的方法是问问题为什么对象未定义,并且很可能是因为数据源没有被正确序列化。
然后我们查看了Chrome Inspector&gt;网络选项卡,看到所有部分请求都很好,我可以看到响应中的所有数据。
但是,在查看Ember Inspector时>数据,列出的部分,但除了在所有字段中显示为未定义的ID之外的所有细节。
然后我们查看了本地应用程序中出现的json以及生产中出现的内容。
{“section”:{“id”:69,“name”:“Whatever”,“plan”:{“id”:11,“name”:“Sample Project”,“slug”:null,“ PROJECT_ID“:78}}
Ember实际上不希望在JSON中嵌入记录,只是id's thankyou。 所以看起来应该是这样的
{ “部分”:{ “ID”:69, “姓名”: “不管”, “plan_id的数据类型”:11}}
好疯狂的是我拼错了我的rails序列化文件: /app/serializers/sections_serializer.rb文件名应该是单数。
简而言之,开发中的rails在运行时搜索文件并忽略了我的错误,而生产应用程序更严格,并且没有以相同的方式查找文件。
一旦我将文件重命名为匹配,我突然能够在本地计算机上产生typeKey错误。
为了实现正确的JSON,我只需要在rails序列化器中使用embed:id,我实现了Id用于我的其他模型但不适用于此。像这样修理它。
class SectionSerializer < ActiveModel::Serializer
attributes :id, :name, :info
embed :id # add this line to get your rails serializer to set things up like Ember likes
end
错误已修复。
我必须解决的一个最奇怪的错误。
另一个提示:我们查看并确保我们为相关的宝石和凉亭组件设置了明确的版本,但这并不是一个问题,但如果生产产生的错误多于开发中的错误,那么这是一个明显的起点。