jonathan.a.katz
jonathan.a.katz

Reputation: 47

How to create simple userProfile route in Meteor with Iron Router

I am trying to route to the current user's profile page using Iron Router, but the 'pathFor' Spacebars helper is not passing the href attribute for the a tag.

This is my template:

<div class="collapse navbar-collapse" id="navigation">
  <ul class="nav navbar-nav">
    {{#if currentUser}}
      <li><a href="{{pathFor 'requestSubmit'}}">Submit Request</a></li>
      <li><a href="{{pathFor 'userProfile'}}">View Profile</a></li>
    {{/if}}
  </ul>
  <ul class="nav navbar-nav navbar-right">
    {{> loginButtons}}
  </ul>
</div>

The href for the Submit Request button is passing in just fine, but for some reason the View Profile href is not getting passed in.

My router.js is as follows:

Router.route('/users/:_id', {
  name: 'userProfile',
  data: function() {
    return Meteor.users.findOne(this.params._id);
  }
});

In my app, I am routing to single "request" page (I created a collection called requests) by doing

Router.route('/requests/:_id, {
  name: 'requestPage',
  data: function() {
    return Requests.findOne(this.params._id);
  }
});

This routes correctly to a single request from the Requests collection, so I am confused why the userProfile route doesn't do the same.

Also, I tried to force this functionality by creating a click event on the template:

Template.header.events({
  'click .userProfile': function(e) {
    e.preventDefault();

    var user = Meteor.user();

    Router.go('userProfile', {_id: user._id});
  }
});

..and this passed the correct href in to the template.

Any help on this would be greatly appreciated!

Upvotes: 0

Views: 313

Answers (1)

David Weldon
David Weldon

Reputation: 64312

The userProfile route needs an id parameter. When you call pathFor in a template with only the route name it will attempt to extract the parameters from the current context. Because the context isn't a user (it's a request?) you will end up with an invalid path.

You can set the context inline:

<li><a href="{{pathFor 'userProfile' data=currentUser}}">View Profile</a></li>

Alternatively, you can set the context outside of the call using with:

{{#with currentUser}}
  <li><a href="{{pathFor 'userProfile'}}">View Profile</a></li>
{{/with}}

Upvotes: 1

Related Questions