0

Rails API に関連付けられた Ember アプリがあります。

私のモデルは次のように定義されています:

NewsCMS.NewsItem = DS.Model.extend({
  title: DS.attr('string'),
  date: DS.attr('date'),
  body_html: DS.attr('string')
});

アプリが起動すると、現在のモデルを正常に取得して表示しますが、新しい NewsItem を作成し、そのアイテムが API から返されると、エラーが発生します。

キャッチされないエラー: アサーションに失敗しました: サーバーはキー body_html のハッシュを返しましたが、そのマッピングがありません

モデルは Rails API に正常に永続化されているため、問題は明らかに新しく作成されたオブジェクトの逆シリアル化にありますが、ブレークポイントを使用しています。

Rails API の index アクションによって返された初期モデル ハッシュの構造と、その create アクションによって返された単一のモデル ハッシュの構造を比較すると、それらは同一であるのに、Ember が新しく作成されたモデルを窒息させているのはなぜですか。問題のないモデル?

例外の発生場所を見ると、ここにあることがわかります。

if (!sideloadedType) {
        sideloadedType = this.sideloadMapping.get(prop);

        if (typeof sideloadedType === 'string') {
          sideloadedType = get(Ember.lookup, sideloadedType);
        }

        Ember.assert("Your server returned a hash with the key " + prop + " but you have no mapping for it", !!sideloadedType);
      }

スタックは次のようになります。

Ember.assert (ember.js:52)
DS.JSONSerializer.DS.Serializer.extend.sideload (ember-data.js:6482)
DS.JSONSerializer.DS.Serializer.extend.extract (ember-data.js:6424)
superWrapper (ember.js:946)
DS.Adapter.Ember.Object.extend.didCreateRecord (ember-data.js:6730)
DS.RESTAdapter.DS.Adapter.extend.createRecord.ajax.success (ember-data.js:7625)
RunLoop._prev (ember.js:4156)
Ember.handleErrors (ember.js:410)
invoke (ember.js:4154)
tryable (ember.js:4343)
Ember.tryFinally (ember.js:1101)
Ember.run (ember.js:4347)
DS.RESTAdapter.DS.Adapter.extend.createRecord.ajax.success (ember-data.js:7624)
jQuery.Callbacks.fire (jquery.js:1038)
jQuery.Callbacks.self.fireWith (jquery.js:1149)
done (jquery.js:8075)
jQuery.ajaxTransport.send.callback (jquery.js:8599)
4

1 に答える 1

0

問題は、モデルの API のシリアル化にあったことが判明しました。Ember が期待する方法でモデルをシリアル化するために、Active Model Serializer を接続していませんでした。

次の形式の JSON を返していました。

{name:"", body:""}

次のようにする必要がある場合:

[
 { news_item: {
    name: "",
    body: ""}
 }
]

そのため、Ember はヒットした最初の属性を、デシリアライズしようとしているモデルのタイプを表すキーとして扱っていました。このモデルをどうするかを確認したところ、マップされたものが見つかりませんでした (モデル自体ではなく、モデルの属性であるため)。

于 2013-03-25T15:46:00.817 に答える