将ember-rails部署到Heroku - TypeError:无法读取未定义的属性'typeKey'

时间:2014-10-24 03:02:43

标签: heroku ember.js ember-rails

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

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]

1 个答案:

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

typeKey错误是什么意思?

正如我所解释的那样,链接到帮助器传递一个对象,它上面应该是一个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 

错误已修复。

我必须解决的一个最奇怪的错误。

另一个提示:我们查看并确保我们为相关的宝石和凉亭组件设置了明确的版本,但这并不是一个问题,但如果生产产生的错误多于开发中的错误,那么这是一个明显的起点。