0

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.

Community
  • 1
  • 1
Sean Li
  • 1
  • 1

1 Answers1

0

Which ember data version and emberjs version are you using? Try saving with id like-

var newPost = this.store.create('post', {
    id:1
    name: 'test post',
    sc_data: [],
    sc_trigger: []
});

Save and create always expects id. So it's better to save/create record with id.

Neha Narlawar
  • 229
  • 3
  • 13