【发布时间】:2016-09-21 02:03:05
【问题描述】:
我正在使用 Backbone 和 Pyramid 创建一个 Web 应用程序(前端和后端,所以两者都在我的控制之下),通过 RESTful API 连接。
在开发过程中,我遇到过几次问题,Backbone PUT(=更新)一个新模型,而它实际上应该 POST(=创建)它。
Backbone 根据 ID 字段的存在来决定是 POST 还是 UPDATE 模型(如果当前模型中不存在 ID:-> POST/create | 如果是:PUT/update)。
但是我现在遇到了几种情况,这种行为与我的应用程序逻辑不匹配。
假设我们的主模型(及其对象永久保存在后端的关系数据库中)称为Foo,具有id、field_1、field_2 等字段。
示例#1:创建Foo 的模板或预览:在创建(=POSTing)Foo 的对象之前,我可以创建并向用户显示预览和/或将其保存为模板。
这样做时,后端(在预览的情况下:临时)将对象添加到数据库并将完整模型(包括其 HTTP 响应中的 ID)返回给 Backbone。
Foo 的模板和预览对象(临时)保存到同一个表中,作为最终对象(type 列指示其类型(0 = 最终/实时,1 = 预览,2 =模板))。
现在 - 在预览/保存为模板之后 - 尝试实际创建 Foo 的对象时,Backbone 模型已经设置了 ID 字段并且实际上 PUTs 和 更新 模板或不再存在预览,而不是 POSTing 并随之在数据库中创建一个新的 Foo(如预期的那样)。
=> 解决方案 #1:调用 POST /json/preview 不会返回 ID 字段,因此 Backbone 不会混淆。
=> 解决方案 #2:覆盖 Backbone-model 中 Foo 的 parse() 以从响应中剔除 ID 字段
.=> 有点效果
示例#2:有一个Periodic 模型,它引用一个Foo-模板。 Periodic 的目的是为用户提供基于 Foo 模板每 X 个月半自动创建一个新 Foo 对象的可能性。
现在有一个调用 GET /json/periodics,它返回所有 Periodic-objects 及其嵌套的 Foo-objects (Foo-templates),包括它们的 ID,例如[{'interval': 12, template_id: 42, template: { 'id': 42, field_1: 'foo', field_2: 'bar', .. } , { .. } , .. ].
在前端,用户现在可以定期确认(或跳过)创建一个新的Foo-object,方法是发出:periodics[X].template.save() 但又是PUTs 并随之更新Foo-model,而不是POSTing 并创建一个新的(如预期的那样)。
再次在这里(如示例 1),我可以删除 Foo 的 ID 字段 - 无论是在后端还是前端。
但是在某些情况下,我需要模板的id-字段,例如在实际编辑它们时,所以在这里我需要两个电话(GET /json/templates_WITHOUT_FOO-IDs 和GET /json/templates_WITH_FOO-IDs)。这听起来也不对。
问题是:在某些情况/视图中,避免 Backbone 错误地假设模型应该是 PUT 而不是 POSTed 的正确(和一致)方法是什么?
【问题讨论】:
-
你可以覆盖
Backbone.sync并根据你的应用逻辑做任何你想做的事情。
标签: javascript rest http backbone.js pyramid