Search code examples
javascriptember.jsframeworksember-data

Returning a record with a string in ember


I am trying to implement a search function where a user can return other users by passing a username through a component. I followed the ember guides and have the following code to do so in my routes file:

import Ember from 'ember';

export default Ember.Route.extend({
  flashMessages: Ember.inject.service(),
  actions: {
    searchAccount (params) {
      // let accounts = this.get('store').peekAll('account');
      // let account = accounts.filterBy('user_name', params.userName);
      // console.log(account);

      this.get('store').peekAll('account')
      .then((accounts) => {
        return accounts.filterBy('user_name', params.userName);
      })
      .then((account) => {
        console.log(account);
        this.get('flashMessages')
        .success('account retrieved');
      })
      .catch(() => {
        this.get('flashMessages')
        .danger('There was a problem. Please try again.');
      });
    }
  }
});

This code, however, throws me the following error:

"You cannot pass '[object Object]' as id to the store's find method"

I think that this implementation of the .find method is no longer valid, and I need to go about returning the object in a different manner. How would I go about doing this?


Solution

  • You can't do .then for filterBy.

    You can't do .then for peekAll. because both will not return the Promise.

    Calling asynchronous code and inside the searchAccount and returning the result doesn't make much sense here. since searchAccount will return quickly before completion of async code.

    this.get('store').findAll('account',{reload:true}).then((accounts) =>{
     if(accounts.findBy('user_name', params.userName)){
      // show exists message
     } else {
      //show does not exist message
     }
    });
    

    the above code will contact the server, and get all the result and then do findBy for the filtering. so filtering is done in client side. instead of this you can do query,

    this.store.query('account', { filter: { user_name: params.userName } }).then(accounts =>{
     //you can check with length accounts.length>0
     //or you accounts.get('firstObject').get('user_name') === params.userName
     //show success message appropriately.
    });