如何在燼數據中處理奇異資源?說我有以下REST風格的路線:如何使用RESTAdapter處理奇異資源
GET /cart
POST /cart
UPDATE /cart
DELETE /cart
燼數據預計find()
返回一個陣列,再加上它會自動嘗試以複數我傳遞給我的模型的任何URL。處理這種情況的最佳方法是什麼?
如何在燼數據中處理奇異資源?說我有以下REST風格的路線:如何使用RESTAdapter處理奇異資源
GET /cart
POST /cart
UPDATE /cart
DELETE /cart
燼數據預計find()
返回一個陣列,再加上它會自動嘗試以複數我傳遞給我的模型的任何URL。處理這種情況的最佳方法是什麼?
在這裏可以做很多事情。
RESTAdapter
調用pluralize,它在名稱的末尾添加「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"
})
});
所以,我在GitHub上找到this 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");
}
});
我的服務器上(我使用的軌道),我要補充下面我的路線:
get "cart/:ignored" => "carts#show"
然後我必須添加以下CartSerializer
(使用active_model_serializers寶石):
attributes :id
def id
"singleton"
end
這是必要的,因爲,很顯然,如果json響應中的id與find()(在這種情況下爲singleton
)請求的id不匹配,則ember將不會將數據加載到模型中。
現在,這顯然不是理想的解決方案,但直到ember-data增加對它的支持,它似乎是最不痛苦的方式。
順便說一下,我提交了an issue來增加支持。
我試着實現這個解決方案,它在初始加載時工作...但是一旦我導航到另一個選項卡,然後回到單數資源選項卡,api端點不會再被調用。有任何想法嗎? – flynfish
這是我如何在Ember 1.9中工作的。首先我讀了指南的this section。在最底層,它解釋瞭如何爲一個模型重寫適配器。
App.CartAdapter = App.ApplicationAdapter.extend {
pathForType: ->
'cart'
}
的pathForType功能是當發生複數(至少在我使用的RESTAdapter),所以沒有任何的適配器的其他功能得到的影響(如主機,或命名空間)。
只是爲了分享一個更適合我的工作 - 擴展你的應用程序的ApplicationRouter(它本身擴展了DS.RESTAdapter)。
App.CartAdapter = App.ApplicationAdapter.extend({
pathForType: function(type) {
return 'cart';
}
});
接下來,在App.Router中定義您的資源。圖:
this.resource('cart');
最後,傳遞一個空字符串作爲路線中的ID。這就是允許在沒有id的情況下生成URL的原因。
App.CartRoute = Ember.Route.extend({
model : function(params) {
return this.store.find('cart', '');
}
});
覆蓋buildURL函數將適用於所有模型,但是,對嗎?那麼我的非奇異模型呢?另外,即使我改變了複數形式,find()(不帶參數)也需要一個對象數組,所以這是行不通的。如果我傳遞一個虛假的id來查找,那麼我必須修改我的服務器路由才能接受一個id參數('/ cart /:fake_id'),以便完全忽略它。對於如此常見和簡單的東西來說,這看起來太過分了。 –
構建URL可以做這樣的事情:''如果(record.get( 'singularResouce'){...}否則{this._super.apply(這一點,參數);}''的(...)即可。是你自己的奇異建築URL功能,和你的奇異車型將有''DS.Model.extend({singularResouce:真})'' – Ryan
你甚至可以做一些時髦的,如呼叫''buildUrl''了,但在傳。未定義作爲ID – Ryan