EmberJS 获取用户个人资料信息

EmberJS getting user profile information

在我的 Rails API 中,我正在使用 JSONAPI 默认情况下 Ember 期望的结构。

我有一个 Rails 路由 http://localhost:3000/profile 它将 return 当前登录的用户 JSON.

如何在 Emberjs 中向此 /profile 端点发出任意请求,以便我可以在路由器的 model() 挂钩中获取已登录用户的 JSON?

我尝试按照此处的指南操作:

https://guides.emberjs.com/v2.10.0/models/finding-records/

并且有这个代码:

return this.get('store').query('user', {
  filter: {
    email: 'jim@gmail.com'
  }
}).then(function(users) {
  return users.get("firstObject");
});

但是 return 是错误的用户。 'email' 的值似乎也无关紧要,我可以传递它 'mud' 并且它会 return 我数据库中的所有用户。

我无法在 Ember 中的个人资料路由的 model() 挂钩中向 /profile 发出简单的 GET 请求吗?

更新

我注意到 Ember 中的过滤器实际上只是将查询参数附加到请求的末尾 URL。

所以有了我上面的过滤器,就像提出一个请求:

GET http://localhost:3000/users?filter['email']=jim@gmail.com

这没有帮助,因为我的 Rails 对过滤器查询参数一无所知。

我希望 Ember 会自动找到用户并执行一些黑魔法来过滤用户以匹配我的电子邮件地址,而不是我必须在我的 Rails 中手动构建额外的逻辑 API 查找单条记录。

Hurrmmmmmmm...确实感觉我现在正在与 Ember 的惯例作斗争。

更新

多亏了 Lux,我终于通过以下方法实现了它:

第 1 步 - 生成用户适配器:

ember generate adapter user

第 2 步 - 在用户适配器的 queryRecord 方法覆盖中写入 AJAX 请求

import ApplicationAdapter from './application';
import Ember from 'ember';

export default ApplicationAdapter.extend({
  apiManager: Ember.inject.service(),

  queryRecord: function(store, type, query) {
    if(query.profile) {
      return Ember.RSVP.resolve(
        Ember.$.ajax({
          type: "GET",
          url: this.get('apiManager').requestURL('profile'),
          dataType: 'json',
          headers: {"Authorization": "Bearer " + localStorage.jwt}
        })
      );
    }
  }
});

第 3 步 - 像这样发出 model() 挂钩请求:

import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.get('store').queryRecord('user', {profile: true});
  }
});

嗯,query 用于服务器端过滤。如果你想在客户端使用 store.findAll('user').then(users => users.findBy('email', 'bla@bla.bla'));.

但这不是你想要的。你有你的服务器端过滤器。它就在 /profile 之下。不在 /user.

之下

然而有趣的是 /profile 实际回应的内容。单记录响应或多记录响应。最好的可能是单记录响应,因为您只想 return 一个用户。那么我们如何使用 ember 来做到这一点呢?好吧,我们使用 store.queryRecord().

并且因为 ember 对 /profile 一无所知,我们必须在 user-适配器中用这样的方式告诉它 ember:

queryRecord: function(store, type, query) {
  if(query.profile) {
    return Ember.RSVP.resolve(Ember.$.getJSON('/profile'));
  }
}

然后你就可以 return store.queryRecord('user', { profile: true })