余烬数据中如何处理奇异资源?假设我有以下 RESTful 路线:
GET /cart
POST /cart
UPDATE /cart
DELETE /cart
ember-data 期望find()
返回一个数组,而且它会自动尝试复数我传递给模型的任何 URL。处理这种情况的最佳方法是什么?
你可以在这里做很多事情。
RESTAdapter
调用复数形式,它可以在名称末尾添加"s",或者在复数哈希中查找名称(如果存在)。 假设您的 DS。模型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"
})
});
所以,我在github上找到了这个拉取请求。它已经 8 个月大了,所以从那时起由于复杂性增加而无法工作,但我已经实现了建议的解决方法,如下所示:
App.store = DS.Store.create({
revision: 4,
adapter: DS.RESTAdapter.create({
plurals: {
'cart': 'cart'
}
})
});
App.Cart.reopenClass({
find: function () {
this._super("singleton");
}
});
在我的服务器上(我正在使用轨道),我必须将以下内容添加到我的路由中:
get "cart/:ignored" => "carts#show"
然后我必须将以下内容添加到CartSerializer
(使用 active_model_serializers gem):
attributes :id
def id
"singleton"
end
这是必要的,因为显然,如果 json 响应中的 id 与从 find() 请求的 id 不匹配(在这种情况下singleton
),那么 ember 不会将数据加载到模型中。
现在,这显然不是理想的解决方案,但在余烬数据增加对它的支持之前,这似乎是最不痛苦的方式。
顺便说一下,我提出了一个问题来添加支持。
这是我如何在 Ember 1.9 中做到这一点的。首先,我阅读了指南的这一部分。在最底部,它解释了如何仅覆盖一个型号的适配器。
App.CartAdapter = App.ApplicationAdapter.extend {
pathForType: ->
'cart'
}
pathForType 函数是复数发生的地方(至少在我正在使用的 RESTAdapter 中),因此适配器的其他功能都不会受到影响(如主机或命名空间)。
只是为了分享一个对我有用的更完整的解决方案 - 扩展您应用程序的 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', '');
}
});