Железный маршрутизатор / Выдача информации о пользователе в Метеоре
Я относительно новичок в Метеоре и застрял на некоторое время. У меня есть маршрут /users/:_id, который должен отображать детали, относящиеся к этому идентификатору пользователя. Однако всякий раз, когда я пересекаю этот маршрут, он отображает информацию о текущем вошедшем в систему пользователе, а НЕ о пользователе, данные которого я хочу просмотреть.
Вот мой маршрут:
Router.route('/users/:_id', {name: 'Users', controller: 'usersDetailController'});
Вот мои пользователи DeController:
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');
}
});
И вот мой сервер / опубликовать:
Meteor.publish('userProfileExtended', function() {
return Meteor.users.find({_id: this.userId});
});
Шаблон данных пользователя:
<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}}
Вот мой помощник по шаблонам:
Template.Users.helpers({
user: function() {
return Meteor.users.findOne();
}
}); Может кто-нибудь помочь? Я думаю, что проблема заключается в том, как я ссылаюсь на "this.userId"...
Спасибо!!
1 ответ
Вам нужно изменить функцию публикации, чтобы использовать userId
параметр, который вы указываете при подписке:
Meteor.publish('userProfileExtended', function(userId) {
return Meteor.users.find(userId,{
fields:{
'username':1,
'profile.firstName':1,
'profile.lastName'
}
});
});
В функции публикации userId
будет равно любому значению, которое вы называете Meteor.subscribe
с, в этом случае он будет держать this.params._id
,
Остерегайтесь использования правильного синтаксиса для параметров маршрута, если вы объявляете путь /users/:_id
, вам нужно ссылаться на параметр, используя this.params._id
,
Также обратите внимание, что небезопасно публиковать весь пользовательский документ на клиенте, если вам нужно только показать определенные поля в интерфейсе, поэтому вы хотите использовать fields
вариант Collection.find
публиковать только подмножество пользовательских документов.
РЕДАКТИРОВАТЬ:
Я бы порекомендовал использовать маршрут data
Функция для указания контекста данных, который вы хотите применить при рендеринге вашего шаблона, что-то вроде этого:
data: function(){
return {
user: Meteor.users.findOne(this.params._id)
};
}