Search code examples
meteoriron-routermeteor-blaze

Passing Username to Router Parameters


So I'd like to create a user profile listing the posts a user has made. My problem is passing each username through the router and onto Meteor.publish/subscribe. I keep getting "username undefined"

I suppose my question is: how does Iron Router know what "this.params.username" are? Should the url provide that?

Router

Router.route('userProfile',{
   path: '/:username',
   waitOn: function () {
     return Meteor.subscribe('userprofile', this.params.username)},
   data: function () {return {posts:Posts.find({username: this.params.username})};},
});

Meteor.publish

Meteor.publish('userprofile', function () {
  return Posts.find({username: this.params.username});
});

Template

<template name="userProfile">
 <div class="posts">
  {{#each posts}}
   {{> postItem}}
  {{/each}}
 </div>
</template>

Solution

  • Your routing code is correct, if you console.log the username inside waitOn or data you should get the correct value.

    Router.route('userProfile', {
      path: '/:username',
      waitOn: function () {
        console.log('waitOn', this.params.username);
        return Meteor.subscribe('userprofile', this.params.username);
      },
      data: function () {
        console.log('data', this.params.username);
        return {
          posts: Posts.find({username: this.params.username})
        };
      }
    });
    

    However, the way you fetch the parameter inside your publish function is wrong, you should rewrite your publication like this :

    Meteor.publish('userprofile', function (username) {
      return Posts.find({username: username});
    });
    

    The arguments you send to Meteor.subscribe after the name of the publication are passed to the publish function as parameters.