Search code examples
javascriptember.jsember-cliember-simple-auth

Ember cli error with ember-simple-auth


I'm trying to use ember-simple-auth with a custom session. After logging in, when I try to access the session in a template, like so:

{{session.current_user.email}}

I get the following error:

Uncaught Error: Assertion Failed: Required contextualElement for view <Ember._HandlebarsBoundView:ember375> is missing

if I reload the page, the error goes away. Also, if I use an unbound helper, it goes away:

{{unbound session.current_user.email}}

I have the following code to set the current_user when the user_id changes:

import Session from 'simple-auth/session';
import Ember from 'ember';

export function initialize(container) {
  Session.reopen({
    setCurrentUser: function() {
      var id = this.get('user_id');
      var _this = this;
      if(!Ember.isEmpty(id)) {
        return container.lookup('store:main').find('user', id).then(function(user){
          _this.set('current_user', user);
        });
      }
    }.observes('user_id')
  });
}

export default {
  name: 'authentication',
  before: 'simple-auth',
  initialize: initialize
};

What am I doing wrong?

Edit #1:

Where would I put this code? An initializer? app/sessions/custom.js?

export default Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
     return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

Then in the environment.js I set:

ENV['simple-auth'] = {
  session: 'session:custom'
}

and in the initializer I register the custom session?

container.register('session:custom', Session);

Edit #2:

Moved custom session to sessions/custom.js. Still same error:

Cryptic Ember Error


Solution

  • I would define a currentUser method on the Session that returns the user as a promise:

    export default Session.extend({
      currentUser: function() {
        var userId = this.get('user_id');
        if (!Ember.isEmpty(userId)) {
         return this.container.lookup('store:main').find('user', userId);
        }
      }.property('user_id')
    });
    

    Also you should better define your own customer session class that extends from the Ember Simple Auth Session class instead of reopening that.