abuder
abuder

Reputation: 1050

Ember data 1.0 beta how map embedded data

It seems that ember data have many changing up to version 1.0 beta. All works great with version 0.13. now I want update to higher version. In my case we have an embedded model 'user'

    App.Post = DS.Model.extend({
          subject: DS.attr('string'),
          created: DS.attr('number'),
          fcreated: function(){
              debugger;
              var d =  new Date(this.get('created'));
              return d.toLocaleDateString();
          }.property('created'),

          reporter: DS.belongsTo('user')
}

App.ApplicationAdapter = DS.RESTAdapter.extend({
    namespace: 'restws'
});

The Json from server looks like this.

   {
    "posts": [
      {
       "id": "5226f2670364e70ae7d77266",
       "subject": "Text",
       "created": 1325410935048,
       "reporter": {
               "id": "5226f2660364e70ae7d771e2",
               "firstName": "Doris",
               "lastName": "Baumertr"
       }
  }

I get the following error code 'Uncaught TypeError: Cannot call method 'toString' of undefined'. In the ember source code I see, that in ember-data.js line 2236 the function throw the error 'buildRecord: function(type, id, data) .. ' After debugging I see that the properties type is undefined id is set with the correct id and data is undefined?

What is the mistake? How I can map the embedded data?

Upvotes: 0

Views: 1216

Answers (2)

ddegtyarev
ddegtyarev

Reputation: 138

Here's actually the exact extractSingle method that you need to implement

App.PostSerializer = DS.RESTSerializer.extend({
    extractSingle: function(store, type, payload, id, requestType) {
      if(typeof payload.post.reporter !== "undefined") {
        var reporter_id = payload.post.reporter.id;
        payload.users = [payload.post.reporter];
        payload.post.reporter = reporter_id;
      }
      return this._super.apply(this, arguments);
    }
});

Here's a jsbin http://jsbin.com/EKItexU/1/edit?html,js,output

Note, that I had to redefine ajax method in RESTAdapter to emulate the server returning your JSON.

Also, if you are sideloading users in your JSON, than you'll have to update this method so it doesn't overwrite sideloaded users in your payload (payload.users property)

Upvotes: 2

intuitivepixel
intuitivepixel

Reputation: 23322

Support for embedded records is gone (for now).

You can handle embedded records yourself by implementing extractSingle and reorganizing your JSON payload.

Please read here for more info about the transition: https://github.com/emberjs/data/blob/master/TRANSITION.md#embedded-records

Hope it helps.

Upvotes: 1

Related Questions