Дополнительные функции на модели canjs

Есть ли способ добавить больше привязок покоя к модели, чем просто четыре функции CRUD?

var Customer = can.Model({
    findAll: 'GET /customer',    
    findOne: 'GET /customer/{id}',
    create: 'POST /customer',
    update: 'PUT /customer/{id}',
    destroy: 'DELETE /customer/{id}'
    //maybeAnOtherMethod: 'PUT /customer/{id}/activate'
}, {

});

1 ответ

Решение

Идея REST заключается в том, что у вас есть ресурсы и действия над этими ресурсами. Сам ресурс описывается URL, действие - глаголом http.

Следовательно, GET это действие для чтения, /customer/{id} описывает ресурс, который вы хотите загрузить. Это отлично. И так, все ваши пять методов в порядке, потому что can.Model предназначен для работы с функциями CRUD с помощью базового интерфейса REST.

Проблема с последним (прокомментированным) состоит в том, что вы смешиваете ресурс и действие внутри URL. "Активировать", безусловно, глагол, а не ресурс. Следовательно, он не принадлежит там, но это должен быть глагол http. Вот почему вы не нашли поддержки для этого способа программирования интерфейса REST - просто потому, что это не REST.

Хотя вы могли бы изменить дизайн API, чтобы думать о activate как ресурс, более вероятно, что статус клиента как активированный или не активированный является частью customer ресурс. Вы бы использовали update метод, как вы меняете что-то о клиенте. В CanJS это будет выглядеть примерно так:

Customer.findOne({id: 5), function( customer ){
  customer.attr('active', true);
  customer.save();
}

Короче говоря, в REST все URL-адреса относятся к существительным, а методы http - к глаголам.

Помогает ли это сделать вещи немного яснее?

Другие вопросы по тегам