【问题标题】:'Backbone Relational' model relation adds an 'id' with a collection as a value, preventing PUT and DELETE'Backbone Relational' 模型关系添加一个带有集合作为值的 'id',防止 PUT 和 DELETE
【发布时间】:2014-06-03 17:10:44
【问题描述】:

我通过我创建的 API 成功实现了加载和显示与“Backbone Relational”的关系。我通过反复试验了解事情的运作方式。我确实认为文档缺乏一些清晰度,因为花了很多时间来弄清楚事情是如何工作的。尤其是在如何将事物映射到 API 方面,我认为文档有些欠缺。

问题
添加书签有效,编辑和删除无效。 PUT 变成了 POST,而 DELETE 根本不会触发。当我将id 设置为硬编码的模型时,它确实有效。所以 id 丢失了,这对于 PUT 成为 POST 是有意义的。

问题似乎是id 没有实际的id,而是一个集合。出现问题的视图不需要 BookmarkBinding,它在其他地方使用。简单地说,它具有 Bookmark 作为关系这一事实使 DELETE 和 PUT 中断。

书签绑定模型:

App.Model.BookmarkBinding = Backbone.RelationalModel.extend({
    defaults: {
        set_id: null,
        bookmark_id: null
    },
    relations: [{
        type: Backbone.HasOne,
        key: 'bookmark',
        relatedModel: 'App.Model.Bookmark',
        reverseRelation: {
            type: Backbone.HasOne,
            key: 'id'
        }
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmark-bindings'
});

书签模型:

App.Model.Bookmark = Backbone.RelationalModel.extend({
    defaults: {
        url: 'undefined',
        description: 'undefined',
        visits: 0,
    },
    relations: [{
        type: Backbone.HasMany,
        key: 'termbindings',
        relatedModel: 'App.Model.TermBinding',
        reverseRelation: {
            key: 'bookmark_id',
        }
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmarks'
});

【问题讨论】:

  • 为什么你认为这与 BBR 具体有关?它不会覆盖 savedestroy - 在 Backbone 中唯一检查以确定发出了什么(如果有,在 destroy 的情况下)HTTP 请求是 model.isNew,它仅检查是否有模型有一个id 集。一些可运行的代码(如 jsfiddle)可能会有很大帮助。
  • 顺便说一下,如果您对文档改进有任何建议,请在 github 上告诉我们——人们正在使用带有各种 API 的 BBR,以及实际服务的示例(展示如何使用 keySource/我认为 keyDestination 等)可能会很有帮助。
  • 嗨,保罗,感谢 (bedankt) 的评论。这不是对您的图书馆的批评。问题是我现在使用 BackboneJS 有一段时间了,了解了这些概念,我正在制作一个有很多关系的应用程序,这让我来到了你的图书馆。由于我在 Eloquent ORM 中使用关系的经验,起初 BBR 很难掌握。 BBR 创建它与键和外键的关系的方式对我来说是模糊的,但我怪我自己,而不是你的图书馆。我走了很长一段路,直到我遇到了必须使用唯一键、sourceKey 和destinationKey 的事实。当我有时间时,我会设置一个小提琴!
  • 笨蛋!没有将其视为批评,只是想知道这是否不是“常规”主干问题(这将使修复变得更简单)。如果您对改进某些主题的语法或文档有任何建议,请告诉我。我已经习惯了,以至于我不再注意到其中的特质了...

标签: javascript api backbone.js backbone-relational


【解决方案1】:

来自Backbonejs.org

默认同步处理程序将 CRUD 映射到 RESTful HTTP 方法,如下所示:

create → POST   /collection
read → GET   /collection[/id]
update → PUT   /collection/id
delete → DELETE   /collection/id

您的问题表明您正在发出 HTTP PUT 请求,因此是 Backbone 更新。如果要进行 HTTP POST,请使用 Backbone create。 PUT 请求映射到更新,并要求在 URL 中发送一个 id,根据您的服务器日志,这不会发生。如果您正在创建一个新对象,那么大多数服务器端框架,例如 Rails / Sinatra / Zend 都会为该对象创建一个 id

另一个可能的错误来源是您为关系选择的键,就像您怀疑的那样。

一个 Bookmark 有许多 BookmarkBindings,Backbone-relational 似乎会将它们存储在您在 BookmarkBindings.relations.reverseRelation.key 中指定的字段中,该字段当前定义为“id”。 因此,相关 BookmarkBindings id 的集合将存储在与 Bookmark.id 相同的属性中,从而产生冲突。 Backbone.sync 将向服务器发送一个未定义的值(您可以在日志中看到),因为它会在那里找到一个集合而不是一个整数。

第一个建议 - 您可能不需要双向关系,在这种情况下,将其从 BookmarkBinding 模型中删除。

第二个建议 - 在另一个键上定义反向关系,使其不会与 Bookmark.id 冲突,例如 BookmarkBindings.relations.reversRelation.key : 'binding_ids'

  • 适当披露 - 我从未使用过 Backbone-relational.js,只使用过 Backbone.js。

【讨论】:

  • 我不发出PUT请求,Backbone根据是否存在现有模型来决定方法。这就是整个问题。我已经尝试放弃反向关系,但这也不起作用。谢谢你的反应。稍后我将对其进行更多研究。
【解决方案2】:

问题是在编辑或删除书签模型时,书签绑定模型也想做它的工作,因为它也与书签相关。我已经尝试删除反向关系,但它并没有被证明是一个解决方案,因为在我使用书签绑定的应用程序的另一部分中,事情不再起作用了。

解决方案
我确实最终删除了反向关系(@jarede +1 !),但关键是如何实现外键以从 API 获取关系而没有反向关系。我最终添加了keySourcekeyDestination,这让一切顺利。

旁注
Backbone Rational 也不能处理相同的外键,这也给了我一些问题。这将使最后声明的外键覆盖所有以前的外键。这可能是非常不切实际的,因为在 API 中,模型与名为id 的列相关并不少见。例如,idAttribute 可以设置为 idAttribute: '_id',但外键在您的应用程序中必须是唯一的。

书签绑定模型:

App.Model.BookmarkBinding = Backbone.RelationalModel.extend({
    defaults: {
        set_id: null,
        bookmark_id: null
    },
    relations: [{
        type: Backbone.HasOne,
        key: 'bookmark',
        keySource: 'id',
        keyDestination: 'bookmark',
        relatedModel: 'App.Model.Bookmark'
    }],
    urlRoot: 'http://api.testapi.com/api/v1/bookmark-bindings'
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多