烬数据更新POST时,它应该是PUT



我正在制作Ember.js应用程序。我有一个更新函数,是ObjectController的一部分。

函数应该保存我更新的模型,但是当我调用save();时,它发送POST请求而不是PUT请求。(在Chrome中测试)

为什么会这样?如何确保发送PUT请求以获取更新?

下面是我的代码:
customer = this.get('model');
customer.set('name', 'New name');
customer.save();

作为额外的参考,当我用console.log( customer.get('dirtyType') );记录"dirtyType"时,它说"updated"。

任何帮助,非常感谢!

更新

我已经调整了上面的示例代码以使其更清晰,我不是在创建一个新模型并想要使用PUT。我有一个现有的模型,我需要更新

我不确定您的解决方案在PUT与POST的土地上是否正确。

TL;DR PUT应该定义资源(通过Request-URI),但是我们在创建过程中没有这样做,所以我们不应该使用POST。覆盖创建/保存,如果你需要这个为您的服务器,而不是黑客的isNew属性,这可能会回来咬你。

9.6把

PUT方法请求将所包含的实体存储在要求通用提供。如果Request-URI引用了一个已经存在的资源,所附实体应被视为原服务器上的修改版本。如果Request-URI不指向现有的资源,而该URI是能够被请求用户定义为新资源代理时,源服务器可以使用该URI创建资源。如果一个创建新资源时,源服务器必须通知用户代理通过201(已创建)响应。如果修改了现有资源,则应该发送200 (OK)或204 (No Content)响应码指示请求成功完成。如果资源不能使用Request-URI创建或修改,这是一个适当的错误响应应该被给出,以反映问题的性质问题。实体的接收者绝对不能忽略任何Content-*(例如Content-Range)它不理解或不实现的头并且在这种情况下必须返回501(未实现)响应。

如果请求通过缓存并且请求uri标识一个或多个当前缓存的实体,这些条目应该是被视为陈腐的。此方法的响应不可缓存。

POST和PUT请求之间的根本区别是这反映在Request-URI的不同含义上。的URI。POST请求标识将处理所包含的请求的资源实体。该资源可能是一个数据接受进程,一个到的网关其他协议,或者接受注释的单独实体。相反,PUT请求中的URI标识所包含的实体使用请求——用户代理知道要使用的URI是什么,以及该URI是什么服务器绝对不能尝试将请求应用到其他资源。如果服务器希望将请求应用于不同的URI,

自定义适配器
App.ApplicationAdapter = DS.RESTAdapter.extend({
  createRecord: function(store, type, record) {
    var data = {};
    var serializer = store.serializerFor(type.typeKey);
    serializer.serializeIntoHash(data, type, record, { includeId: true });
    //return this.ajax(this.buildURL(type.typeKey), "POST", { data: data });
    return this.ajax(this.buildURL(type.typeKey), "PUT", { data: data });
  },

  updateRecord: function(store, type, record) {
    var data = {};
    var serializer = store.serializerFor(type.typeKey);
    serializer.serializeIntoHash(data, type, record);
    var id = get(record, 'id');
    // you could do the same here, but it's even more incorrect
    return this.ajax(this.buildURL(type.typeKey, id), "PUT", { data: data });
  },
});
http://www.ietf.org/rfc/rfc2616.txt

谢谢你们的帮助,但是我已经发现了这个问题,它是荒谬的愚蠢。

我一直在使用的API有一个新的标志"is_new",它已经被添加到模型中,并覆盖了"isNew"属性。

让烬(和我)非常困惑。

我已经调整了API,一切都很好!

如果模型是用createRecord创建的,因此有isNew == true并且您调用save(),那么预期的行为是POST。一旦记录被持久化,并且它被更改,因此isDirty == trueisNew == false,那么save()将成为PUT

最新更新