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 が 1 つしかないことに気付き、エラーをコードのこの部分に絞り込むことができました。

            {{#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 インスペクター > [ネットワーク] タブを調べたところ、セクションのすべてのリクエストが問題なく受信され、レスポンスにすべてのデータが含まれていることがわかりました。

しかし、Ember Inspector > Data を見ると、セクションがリストされていましたが、すべてのフィールドで未定義として示された id を除くすべての詳細についてでした。

次に、ローカルでアプリから出力される json と、本番環境で出力されるものを調べました。

{"section":{"id":69,"name":"Whatever","plan":{"id":11,"name":"Sample Project","slug":null,"project_id": 78}}

Ember は、実際には JSON にレコードを埋め込む必要はありません。id のおかげです。だからこんな感じだったはず

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

クレイジーなのは、ファイル名が単数形である必要があるときに、レールシリアライザーファイルのスペルを間違えて /app/serializers/section s _serializer.rb にしたことです。

要するに、開発中のレールは実行時にファイルを探していて、私のエラーを見落としていましたが、本番アプリはより厳密で、同じ方法でファイルを見つけられませんでした。

一致するようにファイルの名前を変更すると、突然、ローカル マシンで 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 

そして、エラーは修正されました。

私が修正しなければならなかった最も奇妙なバグの 1 つです。

もう 1 つのヒント: 関連する gem と bower コンポーネントの明示的なバージョンを設定したことを確認しましたが、これは問題にはなりませんでしたが、本番環境で開発時とは異なるエラーが発生している場合は、明らかな出発点です。

于 2014-10-29T13:24:50.580 に答える