如何使用ember-rest控制器来处理Rails3嵌套资源?

时间:2012-03-01 16:07:48

标签: javascript ruby-on-rails model-view-controller ember.js

我是客户端Javascript MVC的新手,第一个是ember.js app。

我按照这里的说明使用ember-rest创建嵌套模型的后评论类型。

http://www.cerebris.com/blog/2012/01/26/beginning-ember-js-on-rails-part-2/

我开始编写嵌套资源,如下所示:

  resources :conversations do
    resources :comments
  end

现在问题是当我必须编写余烬控制器时:

App.commentsController = Ember.ResourceController.create({   resourceType:App.Comment   resourceURL:'/ conversation /:id / comments' });

我认为我不能在中间使用:id;我怎么能解决这个问题? ember-data能解决这个问题吗?似乎spine.js集成将更容易处理这个。提前谢谢!

1 个答案:

答案 0 :(得分:6)

我一直想从昨天开始回复你对我的帖子的评论,所以我很高兴你在这里提出这个问题。

我首先要说的是,我将ember-rest写为jQuery.ajax上的一个非常薄的层。它不是非常先进,甚至没有内置的协会设施。但是,我正在考虑添加一个,因为这个lib正在得到一些使用。正如您将从下面的代码中看到的那样,可以处理这个概念,但应该在lib中更好地抽象。

可以通过在每个父资源中创建资源控制器的实例来处理关联。每个特定资源控制器应该管理特定的资源数组,但不一定是特定类型的所有资源。

在您的情况下,您可以扩展ResourceController以管理对话的注释:

  App.ConversationComments = Ember.ResourceController.extend({ 
    resourceType: App.Comment,

    // override _resourceUrl() to base the url on the conversation
    _resourceUrl: function() {
      return this.get("conversation")._resourceUrl() + "/comments";
    }
  });

然后,您可以为每个对话配置ConversationComments实例:

  App.Conversation = Ember.Resource.extend({
    resourceUrl:        '/conversations',
    resourceName:       'conversation',
    resourceProperties: ['prop1', 'prop2']

    // init comments
    init: function() {
      this.set("comments", App.ConversationComments.create({ conversation: this }));
    }
  });

最后但并非最不重要的是,您需要检索每个对话的评论:

  conversation.get("comments").findAll();

如果您拥有json中的所有注释,则可以使用loadAll()。调用loadAll()或findAll()的位置和时间取决于您的应用程序的需求。显然,您需要减少ajax调用的次数以获得最佳性能。

Ember-data是一个比ember-rest更雄心勃勃的项目,并且已经支持协会以及交易等高级功能。话虽如此,它正在通过不断变化的API进行非常积极的开发。如果您耐心并愿意深入研究代码,我强烈建议您尝试一下。当尘埃落定时,我也计划在博客上发表文章。