用户设置页面的常见模式是/settings
生效。
在我的Rails应用中,我通过将get 'settings'
映射到Settings#show
并查找current_user
的设置来在API端完成此操作。
但在Ember方面,我很难过。没有用于GET
请求的ID,因此我无法在我的路线中使用this.store.find('setting', params.id)
的典型模式。
处理这种用例的“Ember方式”是什么?
答案 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)
});