I run into a problem when use Ember-data to save a model. The JSON structure for my model looks like:
{ post: {
id: 1,
name: 'post-1',
trigger: ['trigger-1', 'trigger-2'],
data: ['data-1', 'data-2']
}
}
Because 'data' and 'trigger' are reserved keywords for DS.Model
, I created a mapping and renamed them to sc_data
and sc_trigger
as suggestion by Jurre using
Application.SERIALIZATION_KEY_MAPPINGS = {
'sc_data': 'data',
'sc_trigger': 'trigger'
};
Application.ApplicationSerializer = DS.ActiveModelSerializer.extend({
keyForAttribute: function (attr) {
if (Application.SERIALIZATION_KEY_MAPPINGS.hasOwnProperty(attr)) {
return Application.SERIALIZATION_KEY_MAPPINGS[attr];
} else {
return this._super(attr);
}
}
});
So my model for post
looks like:
Application.Post = DS.Model.extend({
name: DS.attr('string'),
sc_trigger: DS.attr(),
sc_data: DS.attr()
});
the sc_trigger
and sc_data
are renmaed mapping for data
and trigger
.
It all worked fine when use this.store.find('post')
and this.store.find('post', 1)
, i.e. GET
calls. When I try to create a record using this.store.createRecord('post')
, it creates a record with the correct attribute name sc_data
and sc_trigger
.
var newPost = this.store.create('post', {
name: 'test post',
sc_data: [],
sc_trigger: []
})
And the serialize
function interprets the mapping correctly as well. newPost.serialize()
returns
{
name: 'test post',
data: [],
trigger: []
}
But when I call newPost.save()
, in the HTTP request body of the POST
call, data
and trigger
field is missing. It only has
{
name: 'test post'
}
I have no idea why newPost.save()
doesn't generate the correct request body when serialize()
is working just fine.
Update
I managed to get around this by removing the keyForAttribute
mapping and using
Application.ApplicationSerializer = DS.ActiveModelSerializer.extend({
attrs: {
sc_data: {key: 'data'},
sc_trigger: {key: 'trigger'}
}
});
This seems to be the suggested way to handle data with reserved keywords.