Ответ JSON API и имена моделей ember

Быстрый вопрос о ключе ответа JSON API «тип», совпадающем с именем модели Ember.

Если у меня есть модель, скажем, «models/photo.js», и у меня есть маршрут, например «/photos», мой ответ JSON API выглядит следующим образом.

{
  data: [{
    id: "298486374",
    type: "photos",
    attributes: {
      name: "photo_name_1.png",
      description: "A photo!"
    }
  },{
    id: "298434523",
    type: "photos",
    attributes: {
      name: "photo_name_2.png",
      description: "Another photo!"
    }
  }]
}

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

Assertion Failed: You tried to push data with a type 'photos' but no model could be found with that name

Это, конечно, потому что моя модель называется "фото"

Теперь в спецификации JSON API есть примечание, которое гласит: «Эта спецификация не зависит от правил перегиба, поэтому значение type может быть как во множественном, так и в единственном числе. Однако одно и то же значение должно использоваться последовательно во всей реализации».

So,

tl; dr Является ли «способ Ember» делать что-то, чтобы и имена моделей, и ключ ответа JSON API «тип» были единственными? или это не имеет значения, лишь бы они совпадали?


person cswright    schedule 28.09.2015    source источник
comment
Сериализатор JSON API ожидает тип множественного числа. Где вы получаете ошибку? Вы используете store.push?   -  person artych    schedule 29.09.2015
comment
Да, я создавал тестовый ответ и использовал store.push. Спасибо еще раз!   -  person cswright    schedule 30.09.2015


Ответы (2)


Сериализатор JSON API ожидает тип множественного числа. Пример полезной нагрузки из руководств.

Поскольку функция modelNameFromPayloadKey формирует ключ в единственном числе, она работает с единственным типом:

// as is
modelNameFromPayloadKey: function(key) {
  return singularize(normalizeModelName(key));
}

но обратная операция payloadKeyFromModelName преобразует имя модели во множественное число и должна быть изменена, если вы используете единственный тип в своем бэкэнде:

// as is
payloadKeyFromModelName: function(modelName) {
  return pluralize(modelName);
}

Важно, что внутренний формат Ember Data JSON API немного отличается от того, который используется JSONAPISerializer. Store.push ожидает тип единственного числа, сериализатор API JSON ожидает множественного числа.

Из обсуждения:

«... ED использует атрибуты camelCased и сингулярные типы внутри, независимо от того, какой адаптер/сериализатор вы используете.

Когда вы используете адаптер/сериализатор JSON API, мы хотим, чтобы пользователи могли использовать примеры, доступные на jsonapi.org, и они просто работали. Большинству пользователей никогда не приходится заботиться о внутреннем формате, поскольку всю работу за них выполняет сериализатор.

Это описано в руководствах, http://guides.emberjs.com/v2.0.0/models/pushing-records-into-the-store/ ..."

person artych    schedule 28.09.2015
comment
Ах! Спасибо, надо было внимательнее прочитать этот гайд - person cswright; 29.09.2015

В зависимости от вашего варианта использования вы можете попробовать pushPayload вместо push. Как следует из документации, некоторая нормализация; и в моем случае это касалось проблемы «множественного и единственного числа».

person Halil Özgür    schedule 20.11.2016