【问题标题】:How do you use ember-rest controllers to work with Rails3 nested resources?你如何使用 ember-rest 控制器来处理 Rails3 嵌套资源?
【发布时间】:2012-03-20 03:36:42
【问题描述】:

我是客户端 Javascript MVC 的新手,第一个 ember.js 应用程序。

我按照此处的说明使用 ember-rest 来创建 post-cmets 类型的嵌套模型。

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

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

  resources :conversations do
    resources :comments
  end

现在的问题是当我不得不编写 ember-rest 控制器时:

App.cmetsController = Ember.ResourceController.create({ 资源类型:App.Comment resourceURL: '/conversations/:id/cmets' });

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

【问题讨论】:

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


    【解决方案1】:

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

    首先我应该说我在 jQuery.ajax 之上编写了 ember-rest 作为一个非常薄的层。它不是非常先进,甚至没有内置的关联工具。但是,我正在考虑添加一个,因为这个库正在得到相当多的使用。从下面的代码中你会看到,这个概念是可以处理的,但应该在 lib 中更好地抽象出来。

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

    在您的情况下,您可以扩展 ResourceController 来管理会话的 cmets:

      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 }));
        }
      });
    

    最后但同样重要的是,您需要检索每个对话的 cmets:

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

    如果你有 json 中的所有 cmets,你也可以使用 loadAll()。您在何时何地调用 loadAll() 或 findAll() 取决于您的应用程序的需求。显然,您会希望减少 ajax 调用的数量以获得最佳性能。

    Ember-data 是一个比 ember-rest 更雄心勃勃的项目,并且已经支持关联以及事务等高级功能。话虽如此,它正在通过不断变化的 API 进行非常积极的开发。如果您有耐心并愿意深入研究代码,我强烈建议您尝试一下。等尘埃落定,我也打算写博客。

    【讨论】:

    • 非常感谢您的详细回复。我正在尝试查看使用 ember-data 需要做多少更改。还在想。
    • 我开始实施你的方法,似乎调用 comment.saveResource() 的 edit.js 的 PUT 或提交函数仍然失败,因为将 json 放到“/cmets”路径而不是“/ conversations/:conversation_id/cmets/:id" 我将如何创建您在博客文章中建议的副本进行编辑?
    • 别管我的问题,我自己删除了“resources :cmets”,只保留了 routes.rb 中的嵌套资源配置
    • 杰瑞 - 这行得通。您还可以为 App.Comment 覆盖 _resourceUrl() 以返回 "/conversations/" + this.get("conversation_id") + "/cmets/" + this.get("id");
    • 再次感谢,丹。在 App.NewCommentView 中,如何使用 conversation_id 创建该评论对象,我尝试了十几种不同的方法,但似乎仍然没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多