Trung Tran
Trung Tran

Reputation: 13721

Iron Router / User details issue in Meteor

I am relatively new to Meteor and have been stuck on an issue for awhile. I have a /users/:_id route that is supposed to display details specific to that user id. However, whenever I hit that route, it displays information for the currently logged in user, NOT of the user whose details I want to view.

Here's my route:

Router.route('/users/:_id', {name: 'Users', controller: 'usersDetailController'});

Here's my usersDetailController:

usersDetailController = RouteController.extend({
waitOn: function () {
    Meteor.subscribe('userProfileExtended', this.params._id);
},

onBeforeAction: function () {
    var currUserId = Meteor.userId();
    var currUser = Meteor.users.findOne({_id: currUserId});
    console.log('admin? ' + currUser.isAdmin);
    if (!currUser.isAdmin) {
        this.render('accessDenied');
    } else {
        this.next();
    }
},
action: function() {
    this.render('Users');
}

});

And here's my server/publish:

Meteor.publish('userProfileExtended', function() {
return Meteor.users.find({_id: this.userId});

});

User Details template:

<template name="Users">

<form>
{{#with user}}

<div class="panel panel-default">
    <div class="panel-heading">{{profile.companyName}} Details</div>
    <div class="row">
        <div class="col-md-4">
            <div class="panel-body">
                <p><label>Company: </label><input id="Company" type="text" value={{profile.companyName}}></p>
                <p><label>Email: </label><input id="Email" type="text" value={{emails.address}}></p>
                <p><label>Phone: </label><input id="Phone" type="text" value={{profile.phoneNum}}></p>
                <p><label>Tire Markup: </label><input id = "tireMarkup" type="text" value={{profile.tireMarkup}}></p>
                <p><button class="saveUserDetails">Save</button></p>
                <p><button class="deleteUser">Delete User</button></p>
            </div>
        </div>

        </div>
    </div>


{{/with}}

Here's my Template Helper:

Template.Users.helpers({
user: function() { 
return Meteor.users.findOne();
}

}); Can someone help? I think the issue is the way i reference "this.userId"...

Thank you!!

Upvotes: 1

Views: 61

Answers (1)

saimeunt
saimeunt

Reputation: 22696

You need to change your publish function to use the userId parameter you specify when subscribing :

Meteor.publish('userProfileExtended', function(userId) {
  return Meteor.users.find(userId,{
    fields:{
      'username':1,
      'profile.firstName':1,
      'profile.lastName'
    }
  });
});

In the publish function, userId will equal whatever value you call Meteor.subscribe with, in this case it will hold this.params._id.

Beware of using the proper syntax for route parameters, if you declare a path of /users/:_id, you need to reference the param using this.params._id.

Also note that it's insecure to publish the whole user document to the client if you only need to show specific fields in the interface, that's why you want to use the fields option of Collection.find to only publish a subset of user documents.

EDIT :

I would recommend using the route data function to specify the data context you want to apply when rendering your template, something like this :

data: function(){
  return {
    user: Meteor.users.findOne(this.params._id)
  };
}

Upvotes: 1

Related Questions