Поведение Ember.JS ActiveModelAdapter и Active Model Serializers по умолчанию

У меня есть простой сериализатор активной модели:

class ActivitySerializer < ActiveModel::Serializer
  attributes :id, :title, :description, :time
  has_one :category
  has_one :user
end

У меня также есть сериализаторы категорий и пользователей, и они работают так, как ожидалось. Я получаю эту полезную нагрузку:

{"activities":[{"id":1,"title":"Test Activity","description":null,"time":"2014-03-01T06:05:41.027Z","category":{"id":1,"title":"Sports"},"user":{"id":1,"name":"ember"}}]}

Однако они, похоже, не загружаются в Ember.

App.Activity = DS.Model.extend
  title: DS.attr('string')
  description: DS.attr('string')
  time: DS.attr('date')
  category: DS.belongsTo('category')
  user: DS.belongsTo('user')

App.Category = DS.Model.extend
  title: DS.attr('string')
  activities: DS.hasMany('activity')

App.User = DS.Model.extend
  name: DS.attr('string')
  activities: DS.hasMany('activity')

Когда я проверяю инспектора Ember, данные не загружаются. Какой формат ожидает ActiveModelSerializer? Он загружает действие, но не категорию или атрибуты пользователя.


person Ryan Taylor    schedule 25.02.2014    source источник


Ответы (2)


Уловка заняла у меня немного времени, чтобы найти в Интернете, моя модель должна была включать embed :ids.

class ActivitySerializer < ActiveModel::Serializer
  embed :ids, include: true

  attributes :id, :title, :description, :time
  has_one :category
  has_one :user
end

В качестве альтернативы вы можете сделать что-то в том же духе, но никаких обещаний. Я никогда не тестировал этот код.

App.ActivitySerializer = DS.ActiveModelSerializer.extend DS.EmbeddedRecordsMixin,
  attrs:
    user: {embedded: 'always'}
    category: {embedded: 'always'}


App.ApplicationAdapter = DS.ActiveModelAdapter.extend
  defaultSerializer: 'DS/app'
person Ryan Taylor    schedule 25.02.2014
comment
Встраивание: ids работает для меня. Альтернативой является App.ActivitySerializer = DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, { attrs: { category: {embedded: 'always'} } }); - person Pierre Pretorius; 07.04.2014

Идентификатор встраивания, упомянутый Райаном, работает, но у вас могут возникнуть проблемы с перегибами, такими как организованный_by становится организованным_бисом, и тогда вам нужно настроить обе стороны, чтобы исправить это. Код JS, необходимый для решения этой проблемы:

DS.ActiveModelSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: { category: {embedded: 'always'} }
});
person Pierre Pretorius    schedule 07.04.2014