Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON API response and ember model names

A quick question about the JSON API response key "type" matching up with an Ember model name.

If I have a model, say "models/photo.js" and I have a route like "/photos", my JSON API response looks like this

{
  data: [{
    id: "298486374",
    type: "photos",
    attributes: {
      name: "photo_name_1.png",
      description: "A photo!"
    }
  },{
    id: "298434523",
    type: "photos",
    attributes: {
      name: "photo_name_2.png",
      description: "Another photo!"
    }
  }]
}

I'm under the assumption that my model name should be singular but this error pops up

Assertion Failed: You tried to push data with a type 'photos' but no model could be found with that name

This is, of course, because my model is named "photo"

Now in the JSON API spec there is a note that reads "This spec is agnostic about inflection rules, so the value of type can be either plural or singular. However, the same value should be used consistently throughout an implementation."

So,

tl;dr Is the "Ember way" of doing things to have both the model names and the JSON API response key "type" both be singular? or does it not matter as long as they match?

like image 296
cswright Avatar asked Sep 28 '15 21:09

cswright


2 Answers

JSON API serializer expects plural type. Payload example from guides.

Since modelNameFromPayloadKey function singularizes key, it works with singular type:

// as is
modelNameFromPayloadKey: function(key) {
  return singularize(normalizeModelName(key));
}

but inverse operation payloadKeyFromModelName pluralizes model name and should be changed, if you use singular type in your backend:

// as is
payloadKeyFromModelName: function(modelName) {
  return pluralize(modelName);
}

It is important that the internal Ember Data JSON API format differs a bit from the one used by JSONAPISerializer. Store.push expects singular type, JSON API serializer expects plural.

From discussion:

"...ED uses camelCased attributes and singular types internally, regardless of what adapter/serializer you're using.

When you're using the JSON API adapter/serializer we want users to be able to use the examples available on jsonapi.org and have it just work. Most users never have to care about the internal format since the serializer handles the work for them.

This is documented in the guides, http://guides.emberjs.com/v2.0.0/models/pushing-records-into-the-store/ ..."

like image 137
artych Avatar answered Sep 21 '22 17:09

artych


Depending on your use case, you might try pushPayload instead of push. As the documentation suggests, it does some normalization; and in my case it covered the "plural vs. singular" problem.

like image 35
Halil Özgür Avatar answered Sep 18 '22 17:09

Halil Özgür