使用Backbone和Rails实现已加星标的favouriting系统

时间:2012-04-30 09:58:47

标签: javascript ruby-on-rails ruby-on-rails-3 backbone.js coffeescript

我正在尝试为我正在构建的应用添加偏好。

基本设置涉及拥有“概念”集合的用户。他们可以通过提交文本字段向集合中提出新概念。

用户还可以点击一个小星星来“喜欢”这个概念,就像你在Gmail或其他一百万个应用中那样。最受欢迎的概念应该贴在概念集合的顶部,导致新创建的概念出现在它们下面。

要收藏一个概念,我必须将概念的id发布到"/favourites"

class ConceptView extends Backbone.View
  events:
    'click .empty-star' : 'favourite'

  favourite: ->
    @model.favourite()

class Concept extends Backbone.Model
  favourite: ->
    $.post("/favourites", { concept_id: @id }, "json")

我的问题是如何在客户端管理受欢迎和不受欢迎的概念。

我是否应该有两个单独的集合,一个用于受欢迎的概念,另一个用于非受欢迎的概念,或者我应该尝试坚持一个集合?

如果我要在Concept集合中设置FavouritedConcepts模型

class FavouritedConcepts extends Backbone.Collection
  url: "/favourited_concetpts"
  model: Concept

然后我可以通过该集合列出概念就好了,因为favourited_concepts#index自然地将概念范围仅限于那些受欢迎的概念。

然而,ConceptsController "/concepts"会破坏概念,如果我尝试在位于model.destroy()集合中的Concept上调用Backbone的FavouritedConcepts然后它会错误地向DELETE发送"/favourited_concepts"请求。

解决方案可能只是坚持一个概念集合,将favourite布尔属性混合到每个概念上,并定义一个比较器以强制有利的概念坚持到列表的顶部。但是,通过这样做,我觉得我的视图层会失去一些灵活性。我无法拥有从FavouritedConceps集合中收听事件的观点。

实施此功能时,最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我会坚持使用一个带有布尔标志的集合来支持。这将为您节省所有内务管理,以确保收藏品之间的正确状态。

您仍然可以在绑定到Concepts的事件的视图中实现侦听器,您只需要在回调中执行concept.favourite检查。