1

hasManyチェーンに3つのモデルがあります。EGギャラリー->画像->コメント

選択したギャラリーとその中の画像の両方を単一のjson応答で返すと、期待どおりに機能します。バックエンドは、active_model_serializersを使用するRailsアプリです。

{"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

しかし、コメントについてシリアライザーに伝え、それらがjsonに含まれると、Emberからマッピングエラーが発生します。

{"comments":[...],"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

エラー:アサーションに失敗しました:サーバーがキーコメントを含むハッシュを返しましたが、マッピングがありません

これを処理する方法をEmberに適切に指示する方法がわかりません。私のデバッグでは、json応答のすべてがGalleryモデルで直接参照される必要があることが示唆されています。念のため、単数形と複数形の両方を使用して、RESTAdapterに「マッピング」を追加してみました。「comments:App.Comment」または「comment:App.Comment」は、私が見ることができる違いはありません。

諦めてもう少しリクエストをすることもできると思いますが、特定の画像を使用する場合は常にコメントが使用されるため、気分が悪くなります。単一の応答でデータを許可する方法を理解するのに役立つ情報が欲しいです。

IDで参照するのではなく、データを埋め込むためにシリアライザーとEmberを完全に再構成する必要がありますか?

シェール、マーティン

(注:モデル名は、私が実際にモデリングしている楽しいドメインと比較して、より一般的に理解できるようにするために架空のものです)

4

1 に答える 1

2

これに戻るように促してくれてありがとう。

これが私が現在持っているものです。Ember および Ember Data の最近の更新の時点で、これを削除できるかどうかはわかりません。

ストアは次のように指定します。

DS.RESTAdapter.configure("plurals", {
  image: 'images',
  gallery: 'galleries',
  comment: 'comments'
});
DS.RESTAdapter.configure('App.Image', {
  sideloadAs: 'images'
});
DS.RESTAdapter.configure('App.Comment', {
  sideloadAs: 'comments'
});
App.store = DS.Store.create({
  revision: 11,
  adapter: DS.RESTAdapter.create({
    mappings: {
      comments: 'App.Comment'
    }
  })
});

データが画像や物などの通常の単語である場合、複数形の定義は必要ないと確信しています。私のドメインは概念的にはこれらに近いですが、より技術的です。概念と関係をより一般的に理解できるようにするために、これらの名前を付けて投稿することにしました。

私のモデルには次のものが含まれています...他のすべての通常のものの中で。

App.Gallery = DS.Model.extend({
  images: DS.hasMany('App.Image',{key: 'images', embbeded: true})
});

App.Image = DS.Model.extend({
  comments: DS.hasMany('App.Comment',{key: 'comments', embedded: true}),
  gallery: DS.belongsTo('App.Gallery')
});

App.Comment = DS.Model.extend({
  image: DS.belongsTo('App.Image')
});

これにより、質問のような json 構造を返すことができます。

{"comments":[...],"images":[...],"galleries":{"id":1,...,"images":[1,2,3]}}

これは ActiveModelSerializers を使用して Rails から生成されます。私のシリアライザーは次のようになります。

class ApplicationSerializer < ActiveModel::Serializer
  embed :ids, :include => true
end
class GallerySerializer < ApplicationSerializer
  attributes :id, ...
  root "gallery"
  has_many :images, key: :images, root: :images
end
class ImageSerializer < ApplicationSerializer
  attributes  :id, ...
  root "image"
  has_many :comments, key: :comments, root: :comments
end
class CommentSerializer < ApplicationSerializer
  attributes  :id, ...
end

また。あまり冗長でなくても済むと思います。私のレールモデルは「ギャラリー」と呼ばれる単純なものではありません。それらは「BlogGallery」のような名前で区切られていますが、Ember にそのすべてを処理させたくありませんでした。このため、キールートのものが必要です。

アソシエーションとそれらを同じjsonレスポンスに埋め込むことに関して、私が持っているすべてをカバーしていると思います。

于 2013-02-18T12:27:33.063 に答える