Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error while processing route error in ember.js with ember-data

I'm trying to create an app using ember.js and ember-data, using the following versions:

DEBUG: Ember      : 1.7.0
DEBUG: Ember Data : 1.0.0-beta.9
DEBUG: Handlebars : 1.2.1
DEBUG: jQuery     : 2.1.0 

I'm using the RESTAdapter to connect to an api I wrote using node.js.

As soon as I load the app I keep getting the following error:

Error while processing route: students undefined is not a function TypeError: undefined is not a function
    at http://localhost:9000/scripts/vendor/ember-data.js:12006:34
    at tryCatch (http://localhost:9000/scripts/vendor/ember.js:45818:16)
    at invokeCallback (http://localhost:9000/scripts/vendor/ember.js:45830:17)
    at publish (http://localhost:9000/scripts/vendor/ember.js:45801:11)
    at http://localhost:9000/scripts/vendor/ember.js:29069:9
    at DeferredActionQueues.invoke (http://localhost:9000/scripts/vendor/ember.js:634:18)
    at Object.DeferredActionQueues.flush (http://localhost:9000/scripts/vendor/ember.js:684:15)
    at Object.Backburner.end (http://localhost:9000/scripts/vendor/ember.js:147:27)
    at Object.Backburner.run (http://localhost:9000/scripts/vendor/ember.js:202:20)
at apply (http://localhost:9000/scripts/vendor/ember.js:18382:27)

Here's the code I'm using (loaded in the same order I pasted it):

app.js

var App = window.App = Ember.Application.create({
    LOG_ACTIVE_GENERATION: true,
    LOG_TRANSITIONS: true,
    LOG_TRANSITIONS_INTERNAL: false,
    LOG_VIEW_LOOKUPS: true
});

store.js

App.ApplicationAdapter = DS.RESTAdapter.extend({
    host: 'http://localhost:3000',

    serializer: DS.RESTSerializer.extend({
        primaryKey: function(type) {
            return '_id';
        },

        serializeId: function(id) {
            return id.toString();
        }
    })
});

models/student.js

App.Student  = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName: DS.attr('string'),
    nationality: DS.attr('string'),
    createdAt: DS.attr('date')
});

routes/app_route.js

App.StudentsRoute = Ember.Route.extend({
    model: function() {
        return this.store.find('student');
    }
});

router.js

App.Router.map(function () {
    this.resource('students', {path: '/'});
});

And the following is the response of the API:

{
    students: [
        {
            nationality: "Lorem",
            lastName: "Doe",
            firstName: "John",
            _id: "53f87200f3750319b4791235",
            createdAt: "2014-08-23T10:50:40.661Z"
        },
        {
            nationality: "Lorem",
            lastName: "Doe",
            firstName: "John",
            _id: "53f87299f3750319b4791234",
            createdAt: "2014-08-23T10:50:40.661Z"
        }
    ]
}

It looks like the store is not loading the data from the API, but the JSON data format looks fine. Any idea of what could be wrong?

Thanks!

like image 797
Riccardo Bartoli Avatar asked Aug 27 '14 14:08

Riccardo Bartoli


2 Answers

So after searching more on Stack Overflow, I've figured out that the serializer has now to be in a separate class than the RESTAdapter, so the working code is the following:

store.js

App.ApplicationAdapter = DS.RESTAdapter.extend({
    host: 'http://localhost:3000'
});

App.ApplicationSerializer = DS.RESTSerializer.extend({
    primaryKey: '_id',
    serializeId: function(id) {
        return id.toString();
    }
});
like image 138
Riccardo Bartoli Avatar answered Nov 14 '22 09:11

Riccardo Bartoli


Here's an updated answer for people using ember-cli.

ember g adapter application #=> creates app/adapters/application.js
ember g serializer application #=> creates app/serializers/application.js

In app/adapters/application.js:

import DS from 'ember-data';

export default DS.RestAdapter.extend({
  host: 'http://localhost:3000'
});

In app/serializers/application.js:

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  primaryKey: '_id',
  serializeId: function(id) {
    return id.toString();
  }
});
like image 36
Kurt Mueller Avatar answered Nov 14 '22 10:11

Kurt Mueller