Ember数据更新POST应该是PUT

时间:2014-06-22 13:52:18

标签: ajax http post ember.js put

我正在使用Ember.js应用。我有一个更新函数,它是ObjectController的一部分。

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

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

这是我的代码:

customer = this.get('model');
customer.set('name', 'New name');
customer.save();

如需额外参考,当我记录" dirtyType" console.log( customer.get('dirtyType') );表示"已更新"。

非常感谢任何帮助!

更新

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

3 个答案:

答案 0 :(得分:1)

我不确定您的解决方法在PUT与POST之间是否正确。

TL; DR PUT应该定义资源(通过Request-URI),但我们在创建过程中不这样做,因此我们不应该使用POST。如果您的服务器需要这样做,请覆盖创建/保存,而不是攻击isNew属性,这可能会让您感到厌烦。

  

9.6 PUT

     

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

     

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

     

POST和PUT请求之间的根本区别在于      反映在Request-URI的不同含义中。一个中的URI      POST请求标识将处理随附的资源      实体。该资源可能是一个数据接受过程,一个网关      一些其他协议,或接受注释的单独实体。      相反,PUT请求中的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

答案 1 :(得分:1)

感谢所有帮助人员,不过我找到了这个问题并且这是非常愚蠢的。

我一直使用的API有一个新标志" is_new"并且已经添加到模型中并覆盖了#34; isNew"属性。

导致Ember(和我)变得非常困惑。

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

答案 2 :(得分:0)

如果模型是使用createRecord创建的,因此具有isNew == true并且您调用save(),则预期行为为POST。一旦记录被保留,并且记录被更改,因此isDirty == true只有isNew == false,那么save()将是PUT

Models Guide中描述了这一点。