当前用户/设置页面的Ember.js路线

时间:2014-09-17 19:36:45

标签: ruby-on-rails ember.js ember-cli active-model-serializers rails-api

用户设置页面的常见模式是/settings生效。

在我的Rails应用中,我通过将get 'settings'映射到Settings#show并查找current_user的设置来在API端完成此操作。

但在Ember方面,我很难过。没有用于GET请求的ID,因此我无法在我的路线中使用this.store.find('setting', params.id)的典型模式。

处理这种用例的“Ember方式”是什么?

1 个答案:

答案 0 :(得分:1)

此处已讨论过:http://discuss.emberjs.com/t/fetching-single-records/529/3


加载不基于ID的单个记录的问题是,您需要将DS.Model对象作为承诺返回。如果您找回已经存在于客户端内存中的记录,您现在将拥有两个不同的对象来表示相同的记录(类型和ID组合)。举个例子:

var user123 = App.User.find(123);
var currentUser = App.findByUrl('/users/current'); //This is an imaginary method, i.e. Ember Data don't support it
notEqual(user123, currentUser, "The user objects can't be the same cause we don't know what the current user is yet");

现在我们从服务器获得此响应:

{
    "user": {
        "id": 123,
        "name": "Mufasa"
    }
}

现在currentUser和user123都有id 123,但它们本质上是不同的对象=非常糟糕。这就是为什么这种方法不起作用的原因。

相反,您需要加载用户的记录数组,监听它以加载,然后从加载的记录中获取firstObject。像这样:

var users = App.User.find({ is_current: true });
users.one('didLoad', function() {
    App.set('currentUser', users.get('firstObject');
});


$.ajax({
    type: 'GET',
    url: '/users/current',
    success: function(payload) {
        var store = this.store;
        var userReference = store.load(App.User, payload.user);
        App.set('currentUser', store.recordForReference(userReference));
    }.bind(this)
});