Search code examples
meteoriron-router

How to execute function based on URL in Iron Router without any data from collection?


What's the way to route based on Session.set without saving any data to collection? For example user inputs an URL to some site.

'submit #form': function (event, template) {
    event.preventDefault();
    var url = template.find('#input').value;
    if (url)
        Session.set('url', url);
}

What's the route file would look like, if we want to execute function based on an URL let's say to:

www.example.com/download?url=http://youtube.com

and execute function based on this input from an URL?

I don't like my current way of doing this. Seems to me too complicated as following:

Template.formButton.events({
  'submit #form': function (event, template) {
    event.preventDefault();
    var url = template.find('#input').value;
    if (url)
        var linkId = Link.insert({
          url: url,
        });
        var route = {_id:linkId};
        Router.go('download', route);
  }
});
this.route('download', {
  path: '/download/:_id',
  where: 'client',
  data: function() {
    return Link.findOne(this.params._id);
  },
  onBeforeAction: function() {
    var data = this.data();
    if (data)
      var url = data.url;
      console.log(url);
      Meteor.call(getUrl, url, function(error, result) {
        console.log(result)
        this.next();
      });
  }
});

Solution

  • As MasterAM already said, just urlencode your url and provide it directly to your route, but as a query parameter, not a path component:

    Template:

    Template.formButton.events({
      'submit #form': function (event, template) {
        event.preventDefault();
        var url = template.find('#input').value;
        if (url)
            Router.go('download?url=' + encodeURIComponent(url));
      }
    });
    

    Router:

    this.route('download', {
      path: '/download',
      onBeforeAction: function() {
          var url = decodeURIComponent(this.params.query.url);
          console.log(url);
          Meteor.call(getUrl, url, function(error, result) {
            console.log(result)
            this.next();
          });
      }
    });