Backbone.model.save():POST(创建)/ PUT(更新)逻辑与应用程序逻辑不匹配 - 在某些情况下如何避免PUT?

时间:2016-05-24 03:06:49

标签: javascript rest http backbone.js pyramid

我正在使用Backbone和Pyramid创建一个Web应用程序(前端和后端,因此两者都在我的控制之下),通过RESTful API连接。

在开发过程中,我现在遇到过几次问题,其中Backbone PUT(=更新)一个新模型,而它实际上应该POST(=创建)它。

Backbone决定是否根据ID字段的存在来POST或更新模型(如果当前模型中没有ID: - > POST / create |如果是这样:PUT /更新)。

但是我现在遇到了几种情况,这种行为与我的应用程序逻辑不匹配。

让我们说我们的主模型(及其对象被持久保存在后端的关系数据库中)被称为Foo,其中包含idfield_1等字段, field_2

示例#1 :创建Foo的模板或预览:在创建{= POST对象Foo之前,我可以创建和向用户显示预览和/或将其另存为模板。 在执行此操作时,后端(在预览的情况下:暂时)将对象添加到数据库并将完整模型(包括其HTTP响应中的ID)返回Backbone。 Foo的模板和预览对象(暂时)保存到同一个表中,作为最终对象(列type表示其类型(0 = final / live,{{1} } =预览,1 =模板))。 现在 - 在预览/保存为模板后 - 尝试实际创建2的对象时,Backbone模型已经设置了Foo字段,实际上ID更新< / em>模板或不再存在的预览,而不是PUT在数据库中创建新的POST(按预期)。

=&GT;解决方案#1 :调用POST / json / preview不会返回Foo字段,因此Backbone不会感到困惑。

=&GT;解决方案#2 :在Backbone模型中覆盖Foo的parse()以从响应中踢出ID字段

=&GT。有点工作

示例#2 :拥有ID模型,该模型引用Periodic - 模板。 Foo的意图是为用户提供每X个月基于Periodic - 模板半自动创建新Foo对象的可能性。

现在有一个调用GET / json / periodics,它返回所有Foo - 对象及其嵌套的Periodic - 对象(Foo - 模板),包括它们的ID,例如Foo

在前端,用户现在可以通过发出:[{'interval': 12, template_id: 42, template: { 'id': 42, field_1: 'foo', field_2: 'bar', .. } , { .. } , .. ]来定期确认(或跳过)创建新的Foo - 对象,然而periodics[X].template.save()再次PUT更新Foo 1}} - 模型,而不是POST和创建一个新的(按预期)。

再次(如示例1所示),我可以在后端或前端删除ID的{​​{1}}字段。

但是在某些情况下,我需要 Foo - 模板字段,例如实际编辑时,我需要进行两次调用(idGET /json/templates_WITHOUT_FOO-IDs)。这听起来也很不对。

问题是:在某些情况下假设模型应该是GET /json/templates_WITH_FOO-IDs而不是PUT,这是正确(并且一致)避免使用Backbone的方法/ views?

1 个答案:

答案 0 :(得分:0)

  

Backbone的save和fetch方法只是调用Backbone.sync   方法,它只是ajax调用的包装器。你可以通过   在ajax参数中使用save函数而不必实际   延伸它。基本上最终会是这样的:

model.save({attributes you want to save}, {type:'POST', url: 'apiurl/model/:id/played'});

每次都必须这样做,所以为您的模型扩展Backbone.sync可能是更好的做法。

Backbone网站提供了一些关于我所谈论的关于Backbone同步和保存ajax选项的信息。我在扩展同步时也看到了一些例子,但我现在似乎无法追踪它们。