Ответ 1
Короткий ответ заключается в том, что EmberData, вероятно, не подходит для вашего REST API, поскольку ваш REST API на самом деле не является API-интерфейсом для отдыха (он не использует HTTP-глаголы и вместо этого внедряет действия как часть строки запроса).
Почему данные Ember, вероятно, не для вас
В прошлом, возможно, целью проекта Ember Data для поддержки API, такого как тот, который вы описываете, в последнее время разработчики Ember Data прямо заявили, что они не намерены использовать Ember Data используется с нетрадиционными API. Например, основной адаптер, предназначенный для "преодоления пробела" и позволяющий использовать данные Ember с нетрадиционными API REST, был удален.
Здесь фактическая цитата и ссылка на сообщение в блоге на Emberjs.com(стоит прочитать):
"Ember Data теперь сосредоточится на том, чтобы быть наилучшей возможной библиотекой для Приложения Ember.js для общения с обычными API-интерфейсами". (http://emberjs.com/blog/2013/05/03/ember-data-progress-update.html)
Как рекомендовано в этом сообщении в блоге, вы должны проверить следующие библиотеки персистентности данных, которые лучше подходят для вашей ситуации:
https://github.com/endlessinc/ember-restless
https://github.com/ebryn/ember-model
Наконец, вы всегда можете сделать это самостоятельно с помощью AJAX, как это делали участники Discourse http://eviltrout.com/2013/03/23/ember-without-data.html
Аутентификация
Насколько я знаю, Ember Data не обрабатывает аутентификацию приложения, что, как я думаю, у вас есть с вашим примером. Для вашей системы проверки подлинности вы можете посмотреть что-то вроде Ember.SimpleAuth(https://github.com/simplabs/ember-simple-auth), которое может быть сконфигурировано и должно работать с вашим механизмом аутентификации (хотя для этого обязательно потребуется написать пользовательский аутентификатор).
Написание пользовательского Authenticator довольно просто.
Что такое Ember Data Actually Expecting
Я бы порекомендовал прочитать эту страницу, если вы еще ее не видели: http://emberjs.com/guides/models/the-rest-adapter/
Данные Ember собираются использовать HTTP-глаголы для передачи намерений. Поэтому, когда вы делаете вызов createRecord на одной из ваших моделей, а затем сохраняете хранилище, Ember Data выдаст HTTP POST вашему API REST. Когда вы попытаетесь получить запись, Ember выдает запрос GET. Когда вы пытаетесь удалить запись, Ember выдаст запрос DELETE (и т.д.).
Допустим, у вас есть три модели, которые выглядят так:
module.exports = App.ShoppingCart = DS.Model.extend({
user: DS.belongsTo('user'),
items: DS.hasMany('item', {async:true}),
name: attr('string'),
enabled: attr('boolean')
});
module.exports = App.Item = DS.Model.extend({
name: attr('string')
});
module.exports = App.User = DS.Model.extend({
firstName: attr('string')
lastName: attr('string')
});
При попытке загрузить запись с помощью this.store.find('shoppingCart', 1)
Ember сделает запрос GET на множественную форму имени модели (в данном случае GET /shoppingCarts/1
). У Эмбера есть куча правил, встроенных для определения множественной формы слова, поэтому, например, он знает, что множественное число search
равно searches
, а не searchs
. После запроса GET ваш REST API должен вернуть следующий JSON:
{
"shoppingCart": {
"id": 1,
"name": "Bobs Shopping Cart",
"user": 1, //this field links to the user with an id of 1
"enabled": true,
"items": [
1,
2
]
}
}
Если вы делали this.store.find('shoppingCart')
, то Ember Data выдаст GET /shoppingCarts
и ожидают массив объектов корзины покупок с ключом множественного числа имени модели. Например, например:
{
"shoppingCarts": [
{
"id": 1, //not specified in the model but must be sent by the REST API
"name": "Bob Shopping Cart",
"user": 1, //this field links to the user with an id of 1
"enabled": true,
"items": [
1,
2
]
},
{
"id": 2,
"name": "John Shopping Cart",
"user": 2, //this field links to the user with an id of 2
"enabled": false,
"items": [
3, // these are ids for the item models
4
]
}
]
}
Обратите внимание, что при возврате записей с сервера вам необходимо указать поле id
, которое однозначно идентифицирует возвращаемую запись. Поле id не указывается в самой модели. Когда вы создаете новую запись и отправляете данные на сервер, вы не включаете поле id (поскольку оно будет определено на стороне сервера), но REST API затем должен будет вернуть то, что идентификатор находится в ответе.
В приведенном выше примере, если Ember Data имеет пользовательский "1", кэшированный в хранилище, он просто использует эту информацию, иначе он сделает другой запрос GET на GET /users/1
для получения информации для пользователя 1. (Вы можете сделайте это более эффективным, выполнив загрузку записей, если вы хотите избежать нескольких запросов GET).
Подводя итог, соглашение заключается в использовании HTTP-глаголов для передачи того, какие действия следует предпринять, URL-адрес, который Ember Data отправляет запросу, основан на плюрализированной форме имени модели, которую вы запрашиваете.
Большое оговорку
Большая часть того, что я написал выше, основана на предположении, что вы хотите использовать Ember Data "из коробки" без слишком большой настройки. Вообще говоря, я думаю, что Ember Data проще всего работать, когда вы контролируете API REST и можете настроить его, чтобы соответствовать мнению Ember Data о том, как должен работать API REST на основе JSON. Можно изменить поведение Ember Data по умолчанию, но я не очень опытен, пытаясь сгибать Ember Data в соответствии с моим API, поэтому вам может понадобиться некоторая информация от кого-то, кто пытался это сделать.