2013-09-24 62 views
7

在我的模型中使用Ember數據時,在某些情況下,我需要解決數據限制並訪問服務器上的其他準穩定URL。獲取Ember DS.Model類的服務器URL

例如,我有一個Feed對象,它記錄了一個數據流。爲了訪問模型我有一個RESTful端點:

/feeds/:feed_id 

爲了開始和停止錄製的飼料,我需要一個PATCH發送到像一個網址:

/feeds/:feed_id?update_action=start 

隨後我可以重新加載我模型並查看其中反映的變化。

在這種情況下,我需要訪問$.ajax,URL與Ember使用的URL相同。但是,我無法弄清楚如何從Ember中獲取這些信息。

到目前爲止,我所能做的最好的是:

DS.Model.reopen 

    rootForModel: Ember.computed(-> 
    @.store.adapterForType(@).serializer.rootForType(@.constructor) 
) 

    pluralRootForModel: Ember.computed(-> 
    @.store.adapterForType(@).serializer.pluralize(@get("rootForModel")) 
) 

,從而爲App.FeedItem一個實例我可以這樣做:

this.get("rootForModel") # feed_item 
this.get("pluralRootForModel") # feed_items 

而且我猜這將保持同步的任何設置在適配器等。

隨後,我可以打電話像:

$.ajax 
    url: @get("pluralRootForModel") + "/" + @get("id") 
    data: 
    update_action: "start" 
    type: "PATCH" 

這是完全在左邊的領域?有沒有更直接的方式來編寫這些網址?

另一個(相關問題)是獲取給定模型的下劃線名稱。

App.MyModelController => my_model_controller 

我做一樣的東西:

Ember.Object.reopenClass

###* 
* The underscored name for this. 
* i.e. App.MyClass -> my_class 
* From an instance, use this.constructor.underscored_class_name() 
* @return {String} This classname, underscored. 
### 
underscored_class_name: -> 
    _.underscored("#{@}".replace(/^.*?\./g, "")) 

這是瘋了嗎?有沒有更好的方法?

回答

3

Check out buildURL in DS.RESTAdapter

如果要在服務器路徑和密鑰中使用下劃線,請查看DS.ActiveModelAdapter(及其默認串行器,DS.ActiveModelSerializer)。該適配器有自己的buildURL實現。

+0

我決定使用'DS.RESTAdapter.prototype.buildURL('my-model-type')' – aceofspades