Marek Fajkus
Marek Fajkus

Reputation: 588

Ember + Ember Data Route error handling issue

In soume routes in my app error action is never triggered and I can't figure out why. On some Routes error action works fine.

This is application route:

Simitu.ApplicationRoute = Ember.Route.extend({
  init: function() {
    this._super();
    Simitu.AuthManager = Simitu.AuthManager.create();
  },
  model: function() {
    if (Simitu.AuthManager.get('session.user'))
      return this.store.find('admin', Simitu.AuthManager.get('session.user'));
  },
  actions: {
    error: function(reason, transition) {
      if (reason.status === 401) {
        Simitu.AuthManager.reset();
        this.transitionTo('login');
      }
    }
  }
});

On this route Error is never triggered:

Simitu.PlacesIndexRoute = Ember.Route.extend({
  model: function() {
    var self = this;

    // force adapter request
    this.store.find('place');
    return this.store.filter('place', function(record) {

      // return just places that belongs to this client / application
      return record.get('client_id') === self.modelFor('client');
    });
  },
  actions: {
    createNew: function() {
      var place = this.store.createRecord('place');
          // tree structure in places is not implemented yet
          //parent = this.store.find('place', params.place_id);

      place.set('client_id', this.modelFor('client'));

      // open place
      this.transitionTo('place', place);
    },
    error: function(error, transition) {
      return true;
    }
  }
});

And on this Route everything works just fine:

Simitu.ClientsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('client');
  },
  actions: {
    error: function() {
      return true;
    }
  }
});

Have anybody some ide why?

Upvotes: 0

Views: 778

Answers (3)

Marek Fajkus
Marek Fajkus

Reputation: 588

I move some of auth handling logic to beforeModel hook.

Simitu.AuthRoute = Ember.Route.extend({
  beforeModel: function(transition) {
    if (!Simitu.AuthManager.isAutenticated()) {
      this.redirectToLogin(transition);
    }
  },
  redirectToLogin: function(transition) {
    this.transitionTo('login');
  },
  actions: {
    error: function(reason, transition) {
      if (reason.status === 401) {
        Simitu.AuthManager.reset();
        this.redirectToLogin(transoition);
      }
    }
  }
});

Upvotes: 0

Marek Fajkus
Marek Fajkus

Reputation: 588

This is how my router looks like. Maybe it breaks because of the nesting or filter logic in models. I fixed it in beforeModel hook in routes but still have not clue what is wrong with my first solution.

Simitu.Router.map(function () {
  this.resource('login');
  this.resource('clients');
  this.resource('client', { path: 'clients/:client_id'}, function() {
    this.resource('places', function() {
      this.resource('place', { path: ':place_id' });
    });
    this.resource('placecategories',{ path: 'places-categories' }, function() {
      this.route('new');
    });
  });
});

Upvotes: 0

Kingpin2k
Kingpin2k

Reputation: 47367

The error action is fired on the resource, not an individual route.

http://emberjs.jsbin.com/cayidiwa/1/edit

Upvotes: 1

Related Questions