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?
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With