Question

I may be using a totally incorrect approach for my problem and if so please tell me

My Meteor app collects emails address and emails them a link to a download page with a token. This download page is a Iron Router route and the token is the ID of an item in a collection. The token is checked for prior use and then a download will be initiated [that part not written yet]. So I have this route:

this.route('download', {
  path: '/download/:_id',
  template: 'capture_download',
  waitOn: function () {
    return Meteor.subscribe('captures');
  },
  data: function() { return Captures.findOne(this.params._id); }
});

So I need to trigger a call to my server method that does the checking logic as soon as this route is loaded. And I need the ID value to make that call. So I have this:

Template.capture_download.rendered = function(template) {
    Meteor.call('claimDownload', this.data._id, function(err, result) {
       // callback logic here
    });
}

What I don't understand is that this only sometimes works. Sometimes the call happens with the ID value correct. Other times I get:

Exception from Deps afterFlush function function: TypeError: Cannot read property '_id' of null

So I'm thinking that either my template event [rendered] is wrong [I can't find in the docs a list of template events anywhere], or that I need to do something to wait for a valid this value, or that my approach is totally wrong. How would I fix this occasional lack of data in the view when rendered?

Was it helpful?

Solution

Use onBeforeAction within your Iron Router route, rather than a rendered method in the template:

this.route('download', {
  path: '/download/:_id',
  template: 'capture_download',
  waitOn: function () {
    return Meteor.subscribe('captures');
  },
  data: function() { return Captures.findOne(this.params._id); },
  onBeforeAction: function() {
    Meteor.call('claimDownload', this.params._id, function(err, result) {
       // callback logic here
    });
  }
});

See https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#before-and-after-hooks. Your “checking for token prior use” sounds a lot like the “checking that the user is logged in” example in the docs, which is solved with onBeforeAction.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top