Я испытываю некоторую ошибку с данными Ember/Ember. Здесь мой сценарий:
-
Клиент приземляется на трассе
/
, а Ember загружает данные из/api/v1/videos?limit=8
. Ответ исходит из бэкэнда rails-api, используя active_model_serializers, который гарантирует, что ответ соответствует JSON API. Теперь в хранилище загружено 8 произвольных видеороликов. -
Каждый видеокомпонент в DOM имеет ссылку на страницу пользователя (видео
belongsTo
пользователя и видео пользователяhasMany
). -
Клиент нажимает на
link-to
, который переходит на/users/1
, который представляет пользователя с идентификатором 1 -
Крючок модели для этого маршрута загружает только одну запись пользователя. Запись пользователя имеет следующую полезную нагрузку:
{ "data": { "id": "1", "relationships": { "videos": { "data": [], "links": { "related": "/api/v1/videos?user_id=1" } }, }, "type": "users" } }
Проблема заключается в том, что ember автоматически не отправляет запрос для /api/v1/videos?user_id=1
(предположительно потому, что уже был выполнен аналогичный запрос /api/v1/videos?limit=8
).
Если я непосредственно загружаю страницу /users/1
, тогда Ember умнее и автоматически загружает данные из конечной точки /api/v1/videos?user_id=1
.
Я подозреваю, что Ember обманывает тот факт, что аналогичный запрос к конечной точке видео уже произошел с разными параметрами запроса. Конечным результатом является то, что мое приложение не показывает никаких данных на странице пользователя.
Один из способов исправить это - не использовать ссылки/родственный синтаксис, но заполнить "data": [],
идентификаторами видео, которые заставят ember отправлять n запросов для n видео. Это работает, но неприемлемо для приложения большого масштаба, где на странице пользователя могут быть сотни видеороликов.
Как я могу это исправить?
Вы можете видеть, что установка active_model_serializers для ссылок/связанной структуры должна быть специально для данных ember-данных.
Изменить: я попытался избавиться от data: []
, используя include_data false
в active_model_serializers, который не помог.
Изменить 2: Здесь полезная нагрузка /api/v1/videos?limit=8
:
{
"data": [
...
{
"attributes": {
...
},
"id": "325",
"relationships": {
"user": {
"data": {
"id": "1",
"type": "users"
}
}
},
"type": "videos"
},
...
]
}
Другими словами, некоторые из видео в этой полезной нагрузке могут принадлежать пользователю, которого мы позже загрузим.
Изменить 3: Я делаю это как обходной путь в маршруте пользователя:
afterModel(user) {
user.hasMany('videos').reload();
})
Это немного глупо, но на данный момент это делается.
Изменить 4: Я пробовал обновление до ember и ember-data v3. Поведение сохраняется.