John Huntington
John Huntington

Reputation: 397

How can I route to a users profile page?

I show a list of items and for each item its belongs to a user. I list the item's name, description and the user who created it (by there name). I want to also have a link that goes to the user who created the item. Note: That I also link to an item's page.

Here is what I've done so far:

packages

aldeed:collection2
aldeed:simple-schema
iron:router
aldeed:autoform
useraccounts:iron-routing
accounts-password
accounts-base
useraccounts:core
zimme:active-route
todda00:friendly-slugs
reywood:publish-composite

client/items/listed_item.html

<template name="listedItem">
  <a href="{{pathFor 'itemPage'}}">
    {{name}}
  </a>
  <a href="{{pathFor 'profile'}}">
    {{usernameFromId user}}
  </a>
</template>

client/items/items.html

<template name="items">
<div class="items">
        {{#each items}}
            {{> listedItem}}
        {{/each}}
</div>
</template>

client/subscriptions.js

Meteor.subscribe('items');
Meteor.subscribe('allUsernames');
Meteor.subscribe('users');

client/helpers.js

Template.items.helpers({
  items: function() {
    return Items.find();
  },
});

Template.registerHelper("usernameFromId", function (userId) {
  var user = Meteor.users.findOne({_id: this.userId});
  return user.profile.name;
});

server/publications.js

Meteor.publish("items", function () {
  return Items.find();
});

Meteor.publish("users", function () {
  return Meteor.users.find({}, {
    fields: { profile: 1 }
  });
});

Meteor.publish("allUsernames", function () {
  return Meteor.users.find({}, { 
    fields: { 'profile.name': 1, 'services.github.username': 1  }
  });
});

lib/routes.js

Router.route('/items', function () {
  this.render('items');
});

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

What this does though is show the items URL for the users URL, so it links to a user who doesn't exist. i.e. items/1234 = users/1234 when theres only users/1 in the system. How can I get it to link to the correct user ID?

Upvotes: 1

Views: 402

Answers (4)

Lazov
Lazov

Reputation: 1476

I usually use this way: In the template:

<div class="css-light-border">
    <a href="/document/{{_id}}">{{title}}</a>
</div><!-- / class light-border -->

In the router.js file:

Router.route('/document/:_id', function(){
    Session.set('docid', this.params._id);
    this.render('navbar', {to: "header"});
   this.render('docItem', {to: "main"});
  }); 

Basically here docid is the _id of the document which I want to display. Here is an example of how you pull from your database:

somehelper:function(){
        var currentId = Session.get('docid');
        var product = Products.findOne({_id:currentId});
        return product; 

I think it is an easy way because it uses Sessions.

Upvotes: 1

sravanthi
sravanthi

Reputation: 247

Try this:

Router.route('/users/:_id', {
 template: 'profile',
 name: 'profile'
}

In helper you can retrive that record id by this:

Router.current().params._id

Upvotes: 1

ickyrr
ickyrr

Reputation: 2113

In this part:

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

you have referenced the route and created a route to a template with the name "profile" but I can't see any template with that name. Is it possible you just forgot to include it here? or that you really don't have that template?

Just making sure.

Upvotes: 1

MrE
MrE

Reputation: 20778

use a link with the constructed URL

<template name="listedItem">
  <a href="{{pathFor 'itemPage'}}">
    {{name}}
  </a>
  <a href="http://yourdomain.com/users/{{user}}">
    {{usernameFromId user}}
  </a>
</template>

Upvotes: 1

Related Questions