Ember Data v1.0.0-beta.17/18 Released
Beta.17 and Beta.18 contained many bugfixes from the community! Please check them out in the CHANGELOG. Thank you to everyone who submitted patches!
While many bugs were stomped, some important changes are worth calling out:
(Possibly) Breaking Deprecations
record.constructor.typeKey is now record.constructor.modelName
In Ember Data, when you ask for a model, Ember Data looks its class up using Ember's Dependency Injection API. When the model class is looked up, Ember Data stores the type on the model class.
For example, when the following code runs in your application:
var post = this.store.getById('post', 1);
and Ember Data will store the string "post" on the model class:
console.log(post.constructor.typeKey); // 'post'
Ember Data uses this typeKey
property internally when creating and extracting
payloads in Serializers, and when locating models in Adapters. The typeKey
is
also currently available on Snapshots, which are passed to adapter and
serializer methods. typeKey
was previously always normalized to be a
camelCased string.
In Ember Data 1.0.0-beta.18, this property is now called modelName
. In
addition, the modelName
is a dasherized string. For example, if you had a
model called TacoShop
, it would be stored on the model's constructor's
modelName
property as taco-shop
, whereas previously it would be stored as
tacoShop
.
Accessing the typeKey
property should still work, but will trigger
deprecation warnings.
If you don't have any custom serializers or adapters, you are good to go;
outgoing payloads and URLs shouldn't change. If you've overridden a method in
your subclass, remember to call this._super
, or to normalize modelName in
your code. If you need to transform this string, you can use Ember.String's
camelize and underscore functions. Keep in mind you
can't change modelName
on the model's constructor; it is read-only and
will trigger an assertion error if you try to override it.
We changed typeKey
to modelName
to allow us to align to dasherized strings
as Ember and Ember CLI also align with dasherized strings. Changing the name
allows us to make this change with a deprecation phase.
DS.RESTSerializer.typeForRoot is now DS.RESTSerializer.modelNameFromPayloadKey
To gain more consistency in the naming change of typeKey
to modelName
,
typeForRoot
has been renamed to modelNameFromPayloadKey
. The function
serves the same purpose, so this should be a quick refactor you can achieve via
search and replace in your project. While calling typeForRoot will trigger a
deprecation warning, overriding in a subclass won't.
New Features
DS.RESTSerializer.payloadKeyFromModelName
While modelNameFromPayloadKey
returns a model for a JSON payload key,
payloadKeyFromModelName
can be used to override the serialization of a model
to the server. For instance, you may have a Post model, but your server
expects a message
as the root. You can override it like so:
// app/serializers/application.js
export default DS.RESTSerializer.extend({
payloadKeyFromModelName: (modelName) {
if (modelName === 'post') {
return 'message';
}
return this._super(modelName);
}
});
This would produce the following payload:
{
"message": {
"id": "1",
"title": "Action Cable comes with 3 Months of Free HBO"
}
}
Another example is that ActiveModelSerializer uses this hook to convert a
dasherized modelName
to an under_scored
string.
While this was possible previously in Ember Data, we noticed that users used several different hooks to achieve this goal, so it made sense to make one unifying place for this kind of serialization.
store.unloadAll() can now unload all models when not passed a modelName
Previously, store.unloadAll
required a modelName
argument to unload records
of a type. Now, you can unload all records without calling store.destroy
.
Thanks to svox1 for this pull
request!
DS.RESTAdapter.buildURL refactored into different hooks
buildURL
has been refactored into several hooks like urlForFindQuery
. This
makes overriding methods like buildURL
easier to reason about and easier to
change without breaking other request types. Thanks to
thejameskyle for taking on this
refactor!
While beta.17 did introduce a regression, this has been fixed in beta.18.