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

Evo*_*lve 1 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
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

# 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')
Run Code Online (Sandbox Code Playgroud)

我在跑:

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: ------------------------------- 
Run Code Online (Sandbox Code Playgroud)

[编辑:添加项目模型代码] [编辑2:在这里找到关于ember论坛的相关讨论:http://discuss.emberjs.com/t/ember-data-dont-want-to-load-belongsto-relationship/5703/11]

Evo*_*lve 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}}
Run Code Online (Sandbox Code Playgroud)

typeKey错误是什么意思?

正如我所解释的那样,link-to helper传递一个对象,它上面应该是一个section对象.Ember通过调用object.typeKey来询问对象的类型.但在这种情况下,对象丢失,所以我们得到错误消息,基本上说"我试图通过请求它的typeKey查找对象的类型,但没有定义对象".

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

我们如何找到解决方案

然后,我们查看了Chrome Inspector>网络标签,看到所有部分请求都很好,我可以看到响应中的所有数据.

但是,当查看Ember Inspector> Data时,会列出各个部分,但除了在所有字段中显示为未定义的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/section s _serializer.rb当文件名应该是单数的时候.

简而言之,开发中的rails在运行时搜索文件并忽略我的错误,而生产应用程序更严格,并且没有以相同的方式查找文件.

一旦我重命名文件以匹配,我突然能够在我的本地机器上产生typeKey错误.

修复很简单.

为了实现正确的JSON,我只需要在rails serializer中使用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 
Run Code Online (Sandbox Code Playgroud)

错误是固定的.

我不得不解决的一个最奇怪的错误.

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