Chris Johnson
Chris Johnson

Reputation: 187

Ember Nested Data in JSON Response

I'm having some trouble accessing some nested data in one of my Ember models. Below is the JSON response...

{
  "fields": {
    "header": {
      "name": "header",
      "type": "text",
      "localize": false,
      "options": []
    },
    "body": {
      "name": "body",
      "type": "textarea",
      "localize": false,
      "options": []
    }
  },
  "entries": [
    {
      "header": "header test",
      "body": "body test body test body test",
      "_mby": "5a395e8430c2ddoc683600766",
      "_by": "5a395e8430c2ddoc683600766",
      "_modified": 1513709605,
      "_created": 1513709605,
      "_id": "5a3960253d578doc735798511"
    }
  ],
  "total": 1
}

Here is my current serializer

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  normalizeResponse(store, primaryModelClass, payload, id, requestType) 
  {
    payload = {
      entries: payload.entries
    };
    return this._super(store, primaryModelClass, payload, id, requestType);
  }
});

I'm trying to get the Entries in my template. Perhaps I need some help better serializing this with NormalizeResponse? I'm very stumped so please share if you have any ideas!

Thanks!!

Upvotes: 0

Views: 86

Answers (1)

arne.b
arne.b

Reputation: 4340

The ember-data RESTAdapter expects the JSON to contain keys that correspond to model names and values to be arrays of JSON objects with key-value pairs according to the respective models' attribute-name--attribute-value-type definitions*.

So if you have a model named entry containing header: attr('string'), body: attr('string'), the following JSON should lead to an entry in the store:

{
  "entries": [{
      "header": "header test",
      "body": "body test body test body test",
      "id": "5a3960253d578doc735798511"
   }],
}

There is a way to convince ember-data to customize the id field name (to accept _id instead of id). The build-in pluralization rules should include the entry->entries pluralization (but I cannot vouch for it).

Any top-level key that does not correspond to a model name should be ignored anyway, so no need to filter it out manually (unless you have models named field or total).

If you then return this.store.findAll('entry') (or query('entry',{/*something*/}) in your route's model hook, you should be able to look over {{#each model as |entry|}} in your controller's template. (It is good practice to not use model as the model name, but if you want it to be entries, you have to specify that explicitly somewhere, i.e. the controller or the route's setupController method.)

*The point of repeating the name of the model as top-level key in the json response (presumably to an API endpoint of the same name) is that you can include other models if you whish and they will be added to the store as well.

Upvotes: 0

Related Questions