首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主干model.save()没有将ID附加到URL末尾

主干model.save()没有将ID附加到URL末尾
EN

Stack Overflow用户
提问于 2014-04-17 14:03:59
回答 3查看 4.2K关注 0票数 14

我对返回405的主干网PUT请求有问题(方法不允许)。之所以会发生这种情况,是因为代码中的model.save()没有发送到模型url,并在最后显示模型的ID。

这是放的。

代码语言:javascript
复制
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控制台执行put并将id添加到URL中,它就能工作。但是直接从这个代码:

代码语言:javascript
复制
      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");                
          }
      });

在发布之前,控制台上的模型肯定有一个ID。为什么它不能正确地形成URL呢?

Def模型:

代码语言:javascript
复制
define([
'jquery',
'underscore',
'backbone',

], function ($, _, Backbone){

    var ContactModel = Backbone.Model.extend({
      url: "http://localhost:670/api/contacts"        
    });

    return ContactModel;

});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-17 15:33:19

设置Model.url只会给模型提供一个常量URL。如果希望附加模型ID,则需要指定Model.urlRoot。这将生成“/api/contacts/id”形式的URL:

代码语言:javascript
复制
var ContactModel = Backbone.Model.extend({
  urlRoot: "http://localhost:670/api/contacts"        
});

或者,如果模型存储在集合中,则可以将Collection.url设置为相同的。见Model.url注释

委托给Collection#url来生成URL,所以如果该类的所有模型都共享一个公共根URL,那么请确保定义了它,或者使用了urlRoot属性。一个id为101个的模型存储在一个网址为“/ Backbone.Collection /7/notes”的中,它将具有以下网址:"/documents/7/notes/ 101“

票数 20
EN

Stack Overflow用户

发布于 2014-04-17 15:37:33

覆盖url属性。这就是为什么它是固定的-主干调用这个属性/函数来获取url。默认的url函数实现使用urlRoot。将代码更改为此应该有效:

代码语言:javascript
复制
var ContactModel = Backbone.Model.extend({
  urlRoot: "http://localhost:670/api/contacts"        
});

检查这个:model.url

如果您的url格式是特殊的(而不是urlRoot/id),则需要用函数覆盖url以提供自定义实现。

票数 3
EN

Stack Overflow用户

发布于 2014-04-17 15:33:25

您可以通过在Model.url定义中设置显式url属性来掩盖ContactModel的默认行为。使用Model.urlRoot代替:

代码语言:javascript
复制
var ContactModel = Backbone.Model.extend({
  urlRoot: "http://localhost:670/api/contacts"        
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23135350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档