mercredi 7 janvier 2015

Ember Assertion Failed: The response from a findQuery must be an Array, not undefined

Ok, so i checked every single SO answer (like this one or this one)and I could find with similar error like mine and none of the solutions provided helped me solve my problem.


I am learning Ember and trying to mess around with Ember Data RESTAdapter and RESTSerializer to fix up the JSON response from OMDB API .


Most answers to the error I am getting suggest a malformed JSON (such as uncamelized property names) but I am pretty sure nothing is wrong with how I serialize the JSON in MovieSerializer.extractArray.


I have tried adding the normalize method as well as normalizeHash but, as mentioned, I cannot find a property that is invalid or missing (id is there) that needs to be normalized.


JSON received:



{
"Title": "Pulp Fiction",
"Year": "1994",
"Rated": "R",
"Released": "14 Oct 1994",
"Runtime": "154 min",
"Genre": "Crime, Drama, Thriller",
"Director": "Quentin Tarantino",
"Writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"Actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"Plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"Language": "English, Spanish, French",
"Country": "USA",
"Awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"Poster": "http://ift.tt/1gSWNun",
"Metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbID": "tt0110912",
"Type": "movie",
"Response": "True"
}


Serialized JSON (logged in the marked code portion bellow)



{
"movies": [
{
"id": 1,
"title": "Pulp Fiction",
"year": "1994",
"rated": "R",
"released": "14 Oct 1994",
"runtime": "154 min",
"genre": "Crime, Drama, Thriller",
"director": "Quentin Tarantino",
"writer": "Quentin Tarantino (story), Roger Avary (story), Quentin Tarantino",
"actors": "Tim Roth, Amanda Plummer, Laura Lovelace, John Travolta",
"plot": "The lives of two mob hit men, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
"language": "English, Spanish, French",
"country": "USA",
"awards": "Won 1 Oscar. Another 63 wins & 47 nominations.",
"poster": "http://ift.tt/1gSWNun",
"metascore": "94",
"imdbRating": "8.9",
"imdbVotes": "1,039,031",
"imdbId": "tt0110912",
"type": "movie",
"response": "True"
}
]
}


The relevant code of my app is:


Index Route



var IndexRoute = Ember.Route.extend({
model: function() {
return this.get('store').find('movie', {Title: 'Pulp Fiction'}); // calls findQuery in the RESTAdapter
}
});


Model



var Movie = DS.Model.extend({
title: DS.attr('string'),
year: DS.attr('string'),
rated: DS.attr('string'),
released: DS.attr('string'),
runtime: DS.attr('string'),
genre: DS.attr('string'),
director: DS.attr('string'),
writer: DS.attr('string'),
actors: DS.attr('string'),
plot: DS.attr('string'),
language: DS.attr('string'),
country: DS.attr('string'),
awards: DS.attr('string'),
poster: DS.attr('string'),
metascore: DS.attr('string'),
imdbRating: DS.attr('string'),
imdbVotes: DS.attr('string'),
imdbId: DS.attr('string'),
type: DS.attr('string'),
response: DS.attr('string')
});


Adapter



var MovieAdapter = DS.RESTAdapter.extend({

// request sent to http://ift.tt/1tKApI3
buildURL: function(item) {
var title = item.Title.trim().replace(/\s+/, '+').replace(/[A-Z]/g, function(val) {
return val.toLowerCase();
});
return "http://ift.tt/19GbbGf" + title + "&y=&plot=short&r=json";
}

findQuery: function(store, type, query) {
return this.ajax(this.buildURL(query), 'GET');
}

});


Serializer



var MovieSerializer = DS.RESTSerializer.extend({

extractArray: function(store, type, payload) {
var movies = [{
id: 1 // hard-code an id for now
}];

var camelKey;
for(var key in payload) {
camelKey = Ember.String.decamelize(key).camelize();
movies[0][camelKey] = payload[key];
}

payload = { movies: movies };
console.log(JSON.stringify(payload)); // THE SERIALIZED JSON ABOVE IS LOGGED AT THIS POINT
this._super(store, type, payload);
}
});

Aucun commentaire:

Enregistrer un commentaire