1

部分页面加载然后空白,我收到以下错误。

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]

4

1 回答 1

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}}

typeKey 错误是什么意思?

正如我所解释的那样,链接到帮助器传递了一个对象,它上面应该是一个部分对象。Ember 通过调用 object.typeKey 来询问对象的类型。但是在这种情况下,对象丢失了,所以我们收到错误消息,基本上是说“我试图通过请求它的 typeKey 来查找对象的类型,但没有定义对象”。

解决这个问题的方法是问为什么对象未定义,很可能是因为数据源没有被正确序列化。.

我们如何找到解决方案

然后,我们查看 Chrome Inspector > Network 选项卡,发现所有对部分的请求都很好,我可以看到响应中的所有数据。

但是,在 Ember Inspector > Data 中查看时,列出了这些部分,但除了在所有字段中显示为未定义的 id 之外的所有详细信息。

然后,我们查看了本地应用程序中出现的 json 以及生产中出现的内容。

{"section":{"id":69,"name":"Whatever","plan":{"id":11,"name":"示例项目","slug":null,"project_id": 78}}

Ember 实际上不希望在 JSON 中嵌入记录,只是 id 的谢谢。所以它应该看起来像这样

{"section":{"id":69,"name":"Whatever","plan_id":11}}

疯狂的是,当文件名应该是单数时,我将我的 rails 序列化程序文件拼错了:/app/serializers/section s _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 

并且错误已修复。

我不得不修复的最奇怪的错误之一。

另一个提示:我们查看并确保我们为相关的 gem 和 bower 组件设置了明确的版本,但这并没有成为问题,但如果生产中产生的错误与开发中不同,这是一个明显的起点。

于 2014-10-29T13:24:50.580 回答