Evolutio
Evolutio

Reputation: 974

Why I get user and not users on users/index route?

I tried to make a simple emberapp with rails, that shows some users info from our system.

My route: /api/users returns this json:

{"users":[{"id":1,"username":"Evolutio","email":"[email protected]"}]}

My emberadapter:

import DS from 'ember-data';
export default DS.RESTAdapter.extend({
    host: 'https://api.domain.tld',
    namespace: 'api',
    headers: {
        //"API_KEY": "secret key",
    }
});

my users/model.js

import DS from 'ember-data';

export default DS.Model.extend({
  username: DS.attr('string'),
  email: DS.attr('string')
});

my users/index/route.js

import Ember from 'ember';

export default Ember.Route.extend({
    model() {
        let users = this.store.findAll("users");
        return users;
    }
});

I visit this url: localhost:4200/users

When I delete the user/model.js I get this error:

WARNING: Encountered "users" in payload, but no model was found for model name "user" (resolved model name using frontend@serializer:application:.modelNameFromPayloadKey("users"))

and the data with the ember inspector: enter image description here

my index template from users:

<ul>
{{#each model as |user|}}
    <li>
        {{#link-to 'users.show' user}}
            {{user.username}} {{user.roles}}
        {{/link-to}}
    </li>
{{/each}}
</ul>

my scnd problem is, that I cant make any relation. my api returns now this:

{"users":[{"id":1,"username":"Evolutio","email":"[email protected]","roles":[{"id":5,"name":"admin","alias":"Administrator"}]}]}

my user/model.js:

import DS from 'ember-data';

export default DS.Model.extend({
  username: DS.attr('string'),
  email: DS.attr('string'),

  roles: DS.hasMany('role'),
});

and now I got this error:

Error while processing route: users.index Assertion Failed: Passing classes to store methods has been removed. Please pass a dasherized string instead of undefined

I solved it with this: my user_serializer.rb:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :username, :email, :display_role
  #has_many :roles

  def display_role
    "#{object.roles[0].alias}"
  end
end

and my user/model.js:

import DS from 'ember-data';

export default DS.Model.extend({
  username: DS.attr('string'),
  email: DS.attr('string'),
  display_role: DS.attr('string')
});

Upvotes: 0

Views: 63

Answers (1)

Zoltan
Zoltan

Reputation: 4966

You did really well, one thing what you have to change is the file name of your model. If you prefer to use pod syntax move users/model.js to user/model.js, or you can save it app/model/user.js.

The model is always in singular. The file name is in singular.

Update app/index/route.js:

import Ember from 'ember';

export default Ember.Route.extend({
    model() {
        return this.store.findAll("user");   
    }
});

If you've just started to learn Ember.js I have a blog post where you can learn more about the conventions: Ember.js tutorial

Upvotes: 1

Related Questions