Магистральная модель .save() не добавляет идентификатор к концу URL-адреса
У меня проблема с базовым запросом PUT, возвращающим 405 (метод не разрешен). Это происходит потому, что model.save() в коде не отправляет на url модели с идентификатором модели в конце.
Это PUT.
Remote Address:::1:670
Request URL:http://localhost:670/api/contacts
Request Method:PUT
Status Code:405 Method Not Allowed
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Authorization:Bearer YLPwKSpBsBrFUemRHdjz....
Connection:keep-alive
Content-Length:417
Content-Type:application/json
Host:localhost:670
Origin:http://localhost:660
Referer:http://localhost:660/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Request Payloadview source
{id:1, ContactOrganisation:Cow on a Mission, ContactPerson:Ben Drury, Phone:07980567574,…}
Address: "----"
ContactOrganisation: "----"
ContactPerson: "Ben"
CreatedBy: "----"
CreatedOn: "2014-03-03T16:40:50.037"
Description: "----"
Email: "---"
Organistion: "----"
Phone: "----"
Website: "http://www.cogiva.com"
id: 1
Response Headersview source
Access-Control-Allow-Headers:Authorization, Content-Type
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin:*
Allow:GET,POST,OPTIONS
Cache-Control:no-cache
Content-Length:72
Content-Type:application/json; charset=utf-8
Date:Thu, 17 Apr 2014 13:56:38 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
ConsoleSearchEmulationRendering
Если я сделаю через консоль REST и добавлю идентификатор к URL-адресу, он будет работать. Но прямо из этого кода:
this.model.set($(e.currentTarget).data("modelfield"), $(e.currentTarget).val());
console.log("model",this.model);
this.model.save({
success: function(model, response){
console.log("Yup!");
$(self.el).find('.update_loader').removeClass("running");
$(self.el).find('.update_loader').addClass("done");
},
error: function(){
console.log("No!");
$(self.el).find('.update_loader').removeClass("running");
$(self.el).find('.update_loader').addClass("error");
}
});
Модель на консоли прямо перед сообщением, определенно, имела идентификатор. Почему он не должен правильно формировать URL-адрес?
Ошибка модели:
define([
'jquery',
'underscore',
'backbone',
], function ($, _, Backbone){
var ContactModel = Backbone.Model.extend({
url: "http://localhost:670/api/contacts"
});
return ContactModel;
});
Ответы
Ответ 1
Настройка Model.url
просто дает модели постоянный URL. Если вы хотите добавить идентификатор модели, тогда вам нужно указать Model.urlRoot
. Это создаст URL-адреса формы "/api/contacts/id":
var ContactModel = Backbone.Model.extend({
urlRoot: "http://localhost:670/api/contacts"
});
В качестве альтернативы, если модель хранится в коллекции, вы можете установить Collection.url
на то же. Смотрите примечания для Model.url
:
Делегирование в URL-адрес коллекции # для создания URL-адреса, поэтому убедитесь, что вы определили его или свойство urlRoot, если все модели этого класса имеют общий корневой URL-адрес. Модель с идентификатором 101, хранящаяся в Backbone.Collection с URL-адресом "/documents/7/notes", будет иметь этот URL-адрес: "/documents/7/notes/101"
Ответ 2
Вы маскируете поведение по умолчанию Model.url
, установив явный атрибут url
в определение ContactModel
. Вместо этого используйте Model.urlRoot
:
var ContactModel = Backbone.Model.extend({
urlRoot: "http://localhost:670/api/contacts"
});
Ответ 3
Вы перезаписываете свойство url
. Вот почему это исправлено - позвоночник вызывает это свойство/функцию, чтобы получить URL-адрес. И реализация по умолчанию url
использует urlRoot
.
Код изменения для этого должен работать:
var ContactModel = Backbone.Model.extend({
urlRoot: "http://localhost:670/api/contacts"
});
Проверьте это: model.url
Если ваш URL-адрес является специальным (не urlRoot/id
), вам необходимо перезаписать url
с помощью функции для предоставления пользовательской реализации.