获取Ember DS.Model类的服务器URL

Ale*_*s K 7 ember.js ember-data

在我的模型中使用Ember Data时,在某些情况下我需要解决数据限制并访问服务器上的其他准静态URL.

例如,我有一个Feed记录数据流的对象.为了访问模型,我有一个RESTful端点:

/feeds/:feed_id
Run Code Online (Sandbox Code Playgroud)

为了开始和停止录制Feed,我需要发送PATCH一个网址,如:

/feeds/:feed_id?update_action=start
Run Code Online (Sandbox Code Playgroud)

随后我可以重新加载我的模型并查看其中反映的变化.

在这种情况下,我需要访问$.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"))
  )
Run Code Online (Sandbox Code Playgroud)

这样App.FeedItem我可以这样做:

this.get("rootForModel") # feed_item
this.get("pluralRootForModel") # feed_items
Run Code Online (Sandbox Code Playgroud)

而且我猜这将与适配器等中的任何设置保持同步.

随后,我可以这样打电话:

$.ajax
  url: @get("pluralRootForModel") + "/" + @get("id")
  data:
    update_action: "start"
  type: "PATCH"
Run Code Online (Sandbox Code Playgroud)

这完全是在左场吗?是否有更直接的方法来撰写这些网址?

另一个(相关问题)是获取给定模型的下划线名称.

App.MyModelController  => my_model_controller
Run Code Online (Sandbox Code Playgroud)

我做过类似的事情:

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, ""))
Run Code Online (Sandbox Code Playgroud)

这疯了吗?有没有更好的方法?

ger*_*ry3 3

退房buildURLDS.RESTAdapter

如果您想在服务器路径和键中使用下划线,请查看DS.ActiveModelAdapter(及其默认序列化程序DS.ActiveModelSerializer)。该适配器有自己的buildURL.