2013-12-18 3 views
5

Я создаю веб-приложение с помощью Meteor и Iron Router, и одной из моих целей является создание профиля для пользователя, который вошел в систему (где он может редактировать свою информацию) и просмотр профиля для всех пользователей (который может просматривать любой человек).Создание страницы профиля пользователя с помощью Meteor и Iron Router

Профиль профиля пользователя, который вошел в систему, работает хорошо, но у меня возникают проблемы с созданием профиля профиля пользователя для других пользователей. Когда я пытаюсь получить доступ непосредственно в браузере к некоторому профилю пользователя с URL-адресом (eg: localhost:3000/users/"id"), он отображает данные пользователя, входящего в систему, и URL-адрес в браузере изменяется на localhost: 3000/users/[object%20Object].

Также тег со ссылкой на всегда всегда пуст, когда страница с этой информацией отображается.

Вот код, связанные с этой проблемой:

сервер - publications.js

Meteor.publish('singleUser', function(userId) { 
    return Meteor.users.find(userId); 
}); 

router.js

Router.map(function() { 
    this.route('profile', { 
     path:'/profile', 
     data: function() {return Meteor.user();} 
    }); 

    this.route('user_profile', { 
     path: '/users/:_id', 
     waitOn: function() { 
       return Meteor.subscribe('singleUser', this.params._id); 
     }, 
     data: function() { 
       var findById = Meteor.users.findOne(this.params._id); 
       if (typeof findById !== "undefined") { 
      Router.go(getProfileUrlById(findById), {replaceState: true}); 
       } 
     } 
    }); 
}); 

пользователя шаблон профиля

<template name="user_profile"> 
    <h4>Username</h4> 
    <p>{{username}}</p> 
    <h4>Email:</h4> 
    <p>{{email}}</p>  
</template> 

Профиль пользователя Помощники

Template.user_profile.helpers({ 
    username: function() {return Meteor.user().username}, 
    email: function() {return Meteor.user().emails[0].address} 
}); 

шаблон Item

<template name="item"> 
    </span> <a href="{{profileUrl}}">{{author}}</a> 
</template> 

Пункт Помощники Профиль

Template.item.helpers({ 
    profileUrl: function() { 
     var user = Meteor.users.findOne(this.userId, {reactive:false}); 
     if(user) 
      return getProfileUrlById(user); 
    } 
}); 

getProfileUrlById = function(id) { 
    return Meteor.absoluteUrl()+'users/' + id; 
} 

пользователя, вошедшего в шаблоне профиля

<template name="profile"> 
    <h4>Username</h4> 
    <p>{{username}}</p> 
    <h4>Email:</h4> 
    <p>{{email}}</p> 
</template> 

Пользователь вошел в помощниках

Template.profile.helpers({ 
    username: function() {return Meteor.user().username}, 
    email: function() {return Meteor.user().emails[0].address} 
}); 

Я что-то упустил?

Заранее благодарен!

ответ

1

Тип findById, что вы получаете от Meteor.users.findOne является объектом, и поэтому, когда он брошен в строку в getProfileUrlById, он заканчивает тем, что [object Object]. Вероятно, вы захотите передать значение userId от объекта к этой функции, а не к самому объекту.

+0

благодарит за ответ. Вы предлагаете что-то подобное? if (typeof findById! == "undefined") { \t \t \t \t Router.go (getProfileUrlById (findById.userId), {replaceState: true}); \t \t \t} – swayziak

+0

Помогите мне прояснить это? – swayziak

1

Основная проблема заключается в том, что вы не публикуете личные данные в пользовательской коллекции для других пользователей (при условии, что у вас есть пакет autopublish). По умолчанию Meteor публикует только поля под profile. Например, ваше поле username не находится в profile, поэтому оно не будет опубликовано для всех пользователей, кроме тех, которые в настоящее время вошёл в систему.

Во-вторых, вы слишком сложны для создания маршрута.Попробуйте сгенерировать свой маршрут, как это:

{{#each users }} 
<a href="{{ pathFor 'userAccount' }}">My account</a> 
{{/each }} 

Это будет автоматически использовать _id поле в качестве ключа, предполагая, что ваш файл router.js выглядит следующим образом:

Router.map(function() { 
    this.route('userAccount', { 
    path: '/users/:_id' 
    }); 
}); 
0

Ваша функция данных для user_profile маршрута не возвращая никаких данных, т. е. возврат отсутствует. Оно должно быть:

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

Я не уверен, что вы хотите достичь с помощью этого (я предлагаю, чтобы удалить его) ...

if (typeof findById !== "undefined") { 
    Router.go(getProfileUrlById(findById), {replaceState: true}); 
} 

Если маршрут используется URL уже должен быть идентификатор профиля пользователя (/ users/{id}). Кроме того, вы вызываете getProfileUrlById с объектом пользователя, тогда как функция ожидает идентификатор пользователя как строку.

Смежные вопросы