1

让我简要解释一下我的意思。我正在编写一个使用 Ember 和 Rails 的应用程序。每个员工都可以给其他同事一个荣誉。他不知道还有多少人收到了。我只能知道我必须给予多少荣誉,以及我从别人那里得到多少荣誉。

但我无法真正理解如何与 Rails 通信。一张图值一千字,请看这个: kudos app http://wstaw.org/m/2013/03/25/kudos.png

当应用程序启动时,我加载指向 /users 的用户列表。当前用户位于 /currentuser。当前用户的不同之处在于它具有额外的字段,例如 kudosReceived 和 kudosLeft。

假设我想给乔加一个荣誉。我点击一个按钮,然后,什么?假设当我去 /kudos/userid rails 会发挥它的魔力。它只是给乔增加了一个荣誉。但我也想获取更新后的当前用户数据(记住,它位于 /currentuser)。

我应该寄什么?我应该先在控制器上使用 CREATE 还是 UPDATE 方法?如何获取当前用户新数据?在回调中?或者我应该将 /currentuser 与 GET 一起使用。但当?

这就是我现在所拥有的,但我完全不确定它有多正确

// application.handlebars
<h1>My Kudos</h1>

<div id="kudos-content">
  <ul id="kudos-list">
    {{#with controllers.current}}
    <li>
      <p>{{firstName}} {{lastName}}</p>
      <p><img {{bindAttr src="imageUrl"}}  /></p>
      <p>received: {{kudosReceived}}</p>
      <p>left: {{kudosLeft}}</p>
    </li>
    {{/with}}
    {{#each user in controllers.users}}
    <li>
        <p>{{user.firstName}} {{user.lastName}}</p>
        <img {{bindAttr src="user.imageUrl"}}  />
        <a href="#" {{action "addKudo" user.id target="controller.controllers.kudo"}}>(+)</a>
    </li>
    {{/each}}
  </ul>
</div>

Sks.KudoController = Ember.ObjectController.extend({
    addKudo: function(userId) {
      // create a new record on a local transaction
      this.transaction = this.get('store').transaction();
      // don't really know what next
    }
});

下一个问题是如何在 {{action}} 中使用 /kudo/userid

4

1 回答 1

1

听起来Kudo除了计数器之外,没有必要关心客户端中的任何内容。客户不知道任何特定Kudo来自何处或其他任何关于它的信息。在这种情况下,仅将当前用户剩余的 s 数Kudo视为 a就足够了。-1Kudo

如果是这种情况,那么为 . 创建一个DS.ModelKudo,担心关系,将关于 a 的所有内容存储Kudo在存储中,并将 JSON 发布到服务器是 100% 的矫枉过正。如果服务器不期望 JSON 用于 aKudo并且只是为目标用户创建Kudo服务器端,或者增加计数器或其他任何内容,则尤其如此。

如果只需点击该 URL 就足够了,而且听起来确实如此,那么我建议只需使用 jQuery.ajax() 来点击该 URL。我还假设一个成功的响应意味着当前用户少了一个kudosLeft,我只是在成功回调中处理它,而不是担心将 currentUser 模型同步到服务器。如果这不理想,您可以调用reloadcurrentUser 手动获取新数据,假设服务器一直在跟踪kudosLeft服务器端模型。

首先,添加needs: ['current']到您的 KudoController,以便您可以访问 currentUser。

然后在addKudo

addKudo: function(user) {
    jQuery.post('/kudo/' + user.get('id'), jQuery.proxy(function () {
          this.decrementProperty('controllers.current.kudosLeft');
        }, this));
}

这假定 thatCurrentController是 a ,ObjectController因此它将集合传递给它的content

最后,更新您{{action}}以包含完整的User对象,而不仅仅是 id:

<a href="#" {{action "addKudo" user target="controller.controllers.kudo"}}>(+)</a>

几点注意事项:

(1) 使用此方案可能会使客户端与服务器不同步,例如,如果用户打开了另一个应用程序副本并Kudo在那里发送 s。这可能是也可能不是问题。例如,在 Stack Overflow 中,当投票或接受的答案状态发生变化时,UI 会动态更新。在您的情况下,如果它不重要,那么根本不关心保持每件小事同步是可以接受的。在这种情况下,您可能会做的是让您的/kudos端点返回一个特定的状态代码,如果客户端尝试在用户没有剩余的情况下发送一个 kudo。ajax 调用的回调可以测试该状态并触发用户重新加载,或者只是将kudosLeft属性重置为 0。

(2)kudosLeft像这样设置属性会将记录标记为脏记录,因此在提交存储时会导致更新。您可以做的是有一个计算属性,例如displayKudosLeft最初设置为kudosLeft属性,但可以由应用程序更改以更新显示而不将记录标记为脏。

至于何时使用 ember-data,何时使用 $.ajax,这取决于。你的 API 有多大,它有多 RESTful?你使用active_model_serializers, 与 ember-data 配合得很好吗?您是否有很多关系需要反映在客户身上?您是否正在对属性进行大量“一次性”更新,或者达到实际上并不期望接收 JSON 以产生效果的 API 端点?

有大量应用程序(或至少一个)不使用 ember-data 并且运行良好。例如,Discourse 使用了一个很薄的包装器$.ajax,它做得很好。

于 2013-03-25T17:18:28.043 回答