14

ember-data 中的单一资源是如何处理的?假设我有以下 RESTful 路线:

GET /cart
POST /cart
UPDATE /cart
DELETE /cart

ember-data 期望find()返回一个数组,并且它会自动尝试将我传递给我的模型的任何 url 复数。处理这种情况的最佳方法是什么?

4

4 回答 4

7

您可以在这里做很多事情。

调用复数,它要么在RESTAdapter名称的末尾添加一个“s”,要么在复数哈希中查找名称(如果存在)。假设您的 DS.Model 是App.Cart.

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L209

DS.RESTAdapter.create({
  plurals: {
    cart: 'cart'
  }
});

如果您的 URL 方案非常不同并且需要一些进一步的逻辑,您实际上可以覆盖 buildURL 函数。

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js#L288

DS.RestAdapter.create({
  buildURL: function() {
    return "/always_this"
  })
});
于 2012-09-22T01:19:42.433 回答
3

所以,我在 github 上找到了这个 pull request 。它已经 8 个月大了,因此从那时起由于增加了复杂性而无法工作,但我已经实施了建议的解决方法,如下所示:

App.store = DS.Store.create({
  revision: 4,
  adapter: DS.RESTAdapter.create({
    plurals: {
      'cart': 'cart'
    }
  })
});

App.Cart.reopenClass({
  find: function () {
    this._super("singleton");
  }
});

在我的服务器上(我正在使用 rails),我必须将以下内容添加到我的路线中:

get "cart/:ignored" => "carts#show"

然后我必须添加以下内容CartSerializer(使用active_model_serializers gem):

attributes :id
def id
  "singleton"
end

这是必要的,因为显然,如果 json 响应中的 id 与 find() 请求的 id 不匹配(singleton在这种情况下),则 ember 不会将数据加载到模型中。

现在,这显然不是理想的解决方案,但在 ember-data 添加对它的支持之前,这似乎是最不痛苦的方法。

顺便说一句,我提出了一个问题以增加支持。

于 2012-09-22T18:51:42.253 回答
2

以下是我在 Ember 1.9 中的工作方式。首先,我阅读了指南的这一部分。在最底部,它解释了如何为一个模型覆盖适配器。

App.CartAdapter = App.ApplicationAdapter.extend {
  pathForType: ->
    'cart'
}

pathForType 函数是复数发生的地方(至少在我使用的 RESTAdapter 中),因此适配器的其他功能都不会受到影响(如主机或命名空间)。

于 2014-11-21T14:15:57.997 回答
1

只是为了分享一个对我有用的更完整的解决方案 - 扩展您的应用程序的 ApplicationRouter(它本身扩展了 DS.RESTAdapter)。

App.CartAdapter = App.ApplicationAdapter.extend({
    pathForType: function(type) {
        return 'cart';
    }
});

接下来,在 App.Router.map 中定义您的资源:

this.resource('cart');

最后,在路由中传递一个空字符串作为 id。这就是允许在没有 id 的情况下生成 URL 的原因。

App.CartRoute = Ember.Route.extend({
    model : function(params) {
        return this.store.find('cart', '');
    }
});
于 2015-02-13T04:33:36.797 回答