Search code examples
ember.jsember-dataember-cli

Error while processing route, factory is undefined


I'm trying to fetch data (following a tutorial) via RESTAdapter and I'm getting an error I don't understand.

"Error while processing route: players.index" "factory is undefined" "Store<.modelFor@http://localhost:4200/assets/vendor.js:74981:1

Anyone idea of what I'm missing? Do I need install an add-on?

routes/players/index.js

import Ember from 'ember';

export default Ember.Route.extend({
  model: function() {
    return this.store.find('player');
  }
});

models/player.js

import DS from 'ember-data';

export default DS.Model.extend({
  finalScore: DS.attr('number'),
  name: DS.attr('string'),
  heightFormatted: DS.attr('string'),
  heightCm: DS.attr('number'),
  weightLb: DS.attr('number'),
  weightKg: DS.attr('string'),
  birthplace: DS.attr('string'),
  birthdate: DS.attr('string'),
  neoId: DS.attr('number'),
  position: DS.attr('string'),
  number: DS.attr('string'),
  faults: DS.attr('number'),
  stats: DS.belongsTo('stat')
});

models/stat.js

import DS from 'ember-data';

export default DS.Model.extend({
  points: DS.attr('number'),
  assits: DS.attr('number'),
  defr: DS.attr('number'),
  ofr: DS.attr('number'),
  steals: DS.attr('number'),
  blocks: DS.attr('number'),
  turnovers: DS.attr('number'),
  fta: DS.attr('number'),
  ftm: DS.attr('number'),
  fga: DS.attr('number'),
  fgm: DS.attr('number'),
  lsa: DS.attr('number'),
  lsm: DS.attr('number'),
  minutes: DS.attr('number'),
  isStarter: DS.attr('boolean'),
  gamesPlayed: DS.attr('number'),

  player: DS.belongsTo('player')
});

adapters/application.js

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
  host: 'http://localhost:3000',
  namespace: 'api'
});

JSON

{
    "players": [
        {
            "neo_id": 3264,
            "name": "Jeff Green",
            "height_cm": 205,
            "height_formatted": "6'9\"",
            "weight_lb": 235,
            "weight_kg": "106.8",
            "position": "PF",
            "number": "8",
            "birthplace": "Cheverly, Maryland, USA",
            "birthdate": "523843200",
            "stats": {
                "final_score": 344,
                "games_played": 16,
                "minutes": 34.5,
                "points": 19,
                "assits": 1.75,
                "defr": 3.75,
                "ofr": 1,
                "steals": 0.94,
                "blocks": 0.69,
                "turnovers": 1.56,
                "faults": 1.94,
                "neo_id": 3264
            }
        },
        {
            "neo_id": 3265,
            "name": "Erik Murphy",
            "height_cm": 208,
            "height_formatted": "6'10\"",
            "weight_lb": 230,
            "weight_kg": "104.6",
            "position": "PF",
            "number": "-1",
            "birthplace": "Lyon, France",
            "birthdate": "656899200",
            "stats": {}
        }
    ]
}

Solution

  • I wasn't able to reproduce your exact error, but working with what you shared I was able to get it to work by making these changes. If there is something different with your code leave a comment and I will take a look.

    serializers/application.js

    Since you are using a custom primary key (neo_id instead of id) you can change that here, as well as indicate that the stats records are embedded in the players data:

    export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
      attrs : {
        stats: { embedded: 'always' }
      },
      primaryKey : 'neo_id'
    });
    

    Working JSBin