Ajax 余烬数据更新发布应在何时发布
我正在开发一个Ember.js应用程序。我有一个更新函数,是ObjectController的一部分 该函数应该保存我更新的模型,但是当我调用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
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 });
},
});