Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 余烬数据更新发布应在何时发布_Ajax_Http_Post_Ember.js_Put - Fatal编程技术网

Ajax 余烬数据更新发布应在何时发布

Ajax 余烬数据更新发布应在何时发布,ajax,http,post,ember.js,put,Ajax,Http,Post,Ember.js,Put,我正在开发一个Ember.js应用程序。我有一个更新函数,是ObjectController的一部分 该函数应该保存我更新的模型,但是当我调用save()时它发送POST请求,而不是PUT请求。(在铬中测试。) 为什么会这样?如何确保发送PUT请求以进行更新 这是我的密码: customer = this.get('model'); customer.set('name', 'New name'); customer.save(); 作为额外参考,当我使用console.log(custome

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

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

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

这是我的密码:

customer = this.get('model');
customer.set('name', 'New name');
customer.save();
作为额外参考,当我使用
console.log(customer.get('dirtyType'))记录“dirtyType”时上面写着“更新”

非常感谢任何帮助

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

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


这在。

中有描述。我不确定您在PUT vs POST领域的解决方法是否正确

TL;DR PUT应该定义资源(通过请求URI),但是我们在创建过程中不这样做,所以我们不应该使用POST。如果您的服务器需要创建/保存,请重写该命令,而不是黑客攻击
isNew
属性,因为它可能会再次攻击您

放 9.6付诸表决

PUT方法要求将封闭的实体存储在 提供的请求URI。如果请求URI引用的是已存在的 现有资源,封闭实体应视为 位于源服务器上的已修改版本。如果 请求URI不指向现有资源,并且该URI是 能够被请求用户定义为新资源 代理,源服务器可以使用该URI创建资源。如果 创建新资源时,源服务器必须通知用户代理 通过201(已创建)响应。如果修改了现有资源, 应发送200(正常)或204(无内容)响应代码 表示请求已成功完成。如果资源 无法使用请求URI创建或修改,请使用适当的 应给出反映错误性质的错误响应 问题实体的收件人不得忽略任何内容-* (例如内容范围)它无法理解或实现的标题 在这种情况下,必须返回501(未实现)响应

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

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

自定义适配器
谢谢大家的帮助,但是我发现了这个问题,这太愚蠢了

我一直在使用的API有一个新标志“is_new”,该标志已添加到模型中,并覆盖了“isNew”属性

导致余烬(和我)变得非常困惑


我已经调整了API,世界上一切都很好

好的,更多的信息,当我得到模型“isNew”是真的。为了解决这个问题,我将“isNew”设置为false,并且我得到了我期望的PUT请求…谢谢Kevin。该记录已被保留。要清楚,我有一个客户列表,我创建一个新客户并保存。我知道保存是持久的,因为我可以在数据库中看到新记录。然后,我进入个人客户页面,进行更改,然后保存。在这一点上,我得到了一个帖子,而不是一个PUT…让你的想法更进一步,@Kevin Bullaughey,当createRecord保存承诺实现时,我是否需要手动将isNew标记为false,还是应该自动进行标记?isNew和isDirty是仅准备就绪的属性,因此你不能手动更改它们。它们应该由余烬数据自动更新。你确定你没有创造新的记录吗?或者您正在将数据发送到后端,但ember认为调用失败,因此模型尚未进入保存状态?当您查看
customer.get('currentState.stateName')
时,您会得到什么?如果已保存,则应为
root.loaded.saved
,但如果您获得
root.loaded.created.uncommitted
,则尚未保存。感谢您花时间澄清,我相信我已正确阅读此内容:在应用程序中,我将
发布到API以创建模型,然后,稍后我更新模型,当我保存时,我希望发出一个
PUT
请求。然而,这并没有发生。
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 });
  },
});