Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get server URL for Ember DS.Model Class

In using Ember Data for my models, there are some cases where I need to work around the data limitations and access other quasi-restful URLs on my server.

For example, I have a Feed object that records a stream of data. For accessing the models I have a RESTful endpoint:

/feeds/:feed_id

In order to start and stop recording a feed, I need to send a PATCH to a url like:

/feeds/:feed_id?update_action=start

Subsequently I can reload my model and see the changes reflected therein.

In this case, I need to access $.ajax and the URL is the same as the one Ember would use. However, I can't figure out how to eke this information out of Ember.

So far, the best I can do is:

DS.Model.reopen

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

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

Such that for an instance of App.FeedItem I can do:

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

And I'm guessing this would stay in sync with any settings made in the Adapter etc.

Subsequently, I can call like:

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

Is this totally out in left field? Is there a more direct way to compose these URLs?

Another (related issue) is getting the underscored name for a given model.

App.MyModelController  => my_model_controller

I've done something like:

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, ""))

Is this crazy? Are there any better ways?

like image 481
Alexandros K Avatar asked Sep 24 '13 02:09

Alexandros K


1 Answers

Check out buildURL in DS.RESTAdapter.

If you want to use underscores in server paths and keys, check out DS.ActiveModelAdapter (and its default serializer, DS.ActiveModelSerializer). This adapter has its own implementation of buildURL.

like image 172
gerry3 Avatar answered Oct 22 '22 23:10

gerry3