Я собираюсь сделать неправильную вещь здесь и процитировать Википедию относительно надлежащей практики RESTful : PUT до example.com/resources
должно заменить всю коллекцию другой коллекцией. Исходя из этого, когда нам приходилось поддерживать редактирование нескольких элементов одновременно, мы подписали этот контракт.
- Клиент отправляет
{"resources": [{resource1},{resource2}]}
- Сервер заменяет всю коллекцию новой информацией от клиента и возвращает информацию после ее сохранения:
{"resources": [{"id":1,...},{"id":2,...}]}
Мы написали серверную половину контракта в Rails, но вот клиентская половина (в CoffeeScript, извините!):
class ChildElementCollection extends Backbone.Collection
initialize: ->
@bind 'add', (model) -> model.set('parent_id', @parent.id)
url: -> "#{@parent.url()}/resources" # let's say that @parent.url() == '/parent/1'
save: ->
response = Backbone.sync('update', @, url: @url(), contentType: 'application/json', data: JSON.stringify(children: @toJSON()))
response.done (models) => @reset models.resources
Я думал, что это лот проще в реализации, чем переопределение Backbone.sync. Один комментарий к коду: наши коллекции всегда были дочерними объектами, что должно объяснить, почему код устанавливает «parent_id» всякий раз, когда объект добавляется в коллекцию, и как корнем URL является URL родительского объекта. Если у вас есть коллекции корневого уровня, которые вы хотите изменить, просто удалите бизнес @parent
.