如何在Ember中与Rails进行通信
让我简要解释一下我的意思。 我正在编写一个使用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 My Kudos
{{#with controllers.current}} -
{{firstName}} {{lastName}}
received: {{kudosReceived}}
left: {{kudosLeft}}
{{/with}} {{#each user in controllers.users}} -
{{user.firstName}} {{user.lastName}}
(+) {{/each}}
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
听起来没有必要在客户端关心Kudo
,除了柜台。 客户不知道任何特定Kudo
来源或其他任何相关信息。 在这种情况下,将Kudo
视为当前用户离开的Kudo
数量的-1
就足够了。
如果是这种情况,那么为Kudo
创建DS.Model
类,担心关系,在商店中存储关于Kudo
所有内容,以及将JSON发布到服务器是100%矫枉过正。 如果服务器不期望Kudo
JSON并且只是为目标用户创建Kudo
服务器端,或者递增计数器,或者其他什么,那么这是特别的。
如果简单地点击那个URL是必要的,而且听起来就像是,那么我建议只使用jQuery.ajax()来点击URL。 我还假设一个成功的响应意味着当前用户少了一个kudosLeft
,我只是在成功回调中处理它,而不是担心将currentUser模型同步到服务器。 如果这不理想,您可以在currentUser上调用reload
以手动获取新数据,假设服务器已在服务器端模型上跟踪kudosLeft
。
首先,向您的KudoController添加needs: ['current']
,以便您可以访问currentUser。
然后在addKudo
addKudo: function(user) { jQuery.post('/kudo/' + user.get('id'), jQuery.proxy(function () { this.decrementProperty('controllers.current.kudosLeft'); }, this)); }
这假设CurrentController
是一个ObjectController
因此它将set传递给它的content
。
最后,更新您的{{action}}
以包含完整的User
对象,而不仅仅是id:
(+)
几点说明:
(1)使用此方案可能会使客户端与服务器不同步,例如,如果用户打开了另一个应用程序副本并将Kudo
发送到那里。 这可能是也可能不是问题。 例如,在Stack Overflow中,当投票或接受的答案状态发生变化时,UI会动态更新。 在你的情况下可能会接受,如果不重要的话,根本不关心保持每个小事情的同步。 在这种情况下,您可能要做的是让您的/kudos
端点返回特定的状态代码,如果客户端在用户没有剩余时尝试发送工具。 ajax调用的回调可以测试该状态并触发用户重新加载,或者只是将kudosLeft
属性重置为0。
(2)像这样设置kudosLeft
属性会将记录标记为脏,因此在提交商店时会导致更新。 你可以做的是有一个计算属性,比如最初设置为kudosLeft
属性的kudosLeft
,但是应用程序可以更改它来更新显示而不将记录标记为脏。
至于何时使用ember-data,以及何时使用$ .ajax,那取决于。 你的API有多大,它有多REST? 你使用的active_model_serializers
与ember-data有很好的搭配吗? 您是否有很多需要在客户端反映出来的关系? 您是否正在对属性进行大量“一次性”更新,或者为了产生效果而点击实际上并不期望接收JSON的API端点?
有大量的应用程序(或者,至少有一个)不使用ember-data并且做得很好。 例如,话语在$.ajax
周围使用了一个薄的包装,它确实很好。