2012-09-22 17 views
14

如何在燼數據中處理奇異資源?說我有以下REST風格的路線:如何使用RESTAdapter處理奇異資源

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

燼數據預計find()返回一個陣列,再加上它會自動嘗試以複數我傳遞給我的模型的任何URL。處理這種情況的最佳方法是什麼?

回答

7

在這裏可以做很多事情。

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" 
    }) 
}); 
+0

覆蓋buildURL函數將適用於所有模型,但是,對嗎?那麼我的非奇異模型呢?另外,即使我改變了複數形式,find()(不帶參數)也需要一個對象數組,所以這是行不通的。如果我傳遞一個虛假的id來查找,那麼我必須修改我的服務器路由才能接受一個id參數('/ cart /:fake_id'),以便完全忽略它。對於如此常見和簡單的東西來說,這看起來太過分了。 –

+0

構建URL可以做這樣的事情:''如果(record.get( 'singularResouce'){...}否則{this._super.apply(這一點,參數);}''的(...)即可。是你自己的奇異建築URL功能,和你的奇異車型將有''DS.Model.extend({singularResouce:真})'' – Ryan

+0

你甚至可以做一些時髦的,如呼叫''buildUrl''了,但在傳。未定義作爲ID – Ryan

3

所以,我在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來增加支持。

+0

我試着實現這個解決方案,它在初始加載時工作...但是一旦我導航到另一個選項卡,然後回到單數資源選項卡,api端點不會再被調用。有任何想法嗎? – flynfish

2

這是我如何在Ember 1.9中工作的。首先我讀了指南的this section。在最底層,它解釋瞭如何爲一個模型重寫適配器。

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

的pathForType功能是當發生複數(至少在我使用的RESTAdapter),所以沒有任何的適配器的其他功能得到的影響(如主機,或命名空間)。

1

只是爲了分享一個更適合我的工作 - 擴展你的應用程序的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', ''); 
    } 
});