Как я могу перейти на страницу профиля пользователя?

Я показываю список элементов, и каждый элемент принадлежит пользователю. Я перечисляю имя элемента, описание и пользователя, создавшего его (по имени). Я также хочу иметь ссылку, которая ведет к пользователю, создавшему элемент. Примечание. Я также ссылаюсь на страницу элемента.

Вот что я сделал до сих пор:

пакеты

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

клиент/элементы/listed_item.html

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

клиент/предметы/items.html

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

клиент/subscriptions.js

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

клиент/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;
});

сервер/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  }
  });
});

библиотека/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});
  }
});

Однако это показывает URL-адрес элементов для URL-адреса пользователя, поэтому он ссылается на несуществующего пользователя. то есть items/1234 = users/1234 когда в системе есть только пользователи/1. Как я могу заставить его связать с правильным идентификатором пользователя?


person John Huntington    schedule 02.01.2016    source источник
comment
Просто вопрос: в client/helpers.js у вас есть параметр userId, а внутри функции вы используете this.userId. Возможно, вы намеревались найти пользователя с параметром userId?   -  person Jos Harink    schedule 03.01.2016
comment
@JosHarink Да, верно. Я хотел, чтобы помощник работал над поиском полей пользователей для любого шаблона.   -  person John Huntington    schedule 04.01.2016


Ответы (4)


использовать ссылку с построенным URL

<template name="listedItem">
  <a href="{{pathFor 'itemPage'}}">
    {{name}}
  </a>
  <a href="http://yourdomain.com/users/{{user}}">
    {{usernameFromId user}}
  </a>
</template>
person MrE    schedule 05.01.2016
comment
Если я сделаю этот метод, как мне справиться с использованием локального хоста? Похоже, это жестко закодировано. - person John Huntington; 05.01.2016
comment
извините, я написал полный URL, чтобы было понятно, что это такое, но вы, конечно, можете использовать относительные пути: <a href="/users/{{user}}"> - person MrE; 05.01.2016
comment
Сообщение об ошибке? В чем проблема? Видите ли вы свой шаблон, если переходите по правильному URL-адресу в браузере? - person MrE; 08.01.2016
comment
Я вижу, ваша проблема заключается в том, чтобы получить правильный идентификатор пользователя! Итак, вопрос в том, как элемент связан с пользователем? У вас есть идентификатор пользователя в listItem? Я думал, что ваша переменная «пользователь» была правильным идентификатором пользователя, но, видимо, проблема в этом. если идентификатор пользователя находится в объекте элемента, вы можете связаться с ним с помощью this.userID или любого другого пути к объекту, на котором он находится. Опубликуйте формат вашего объекта элемента, если вам нужна дополнительная информация - person MrE; 08.01.2016

В этой части:

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

вы сослались на маршрут и создали маршрут к шаблону с именем «профиль», но я не вижу ни одного шаблона с таким именем. Возможно, вы просто забыли указать это здесь? или что у вас действительно нет этого шаблона?

Просто убеждаюсь.

person ickyrr    schedule 08.01.2016

Попробуй это:

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

В помощнике вы можете получить этот идентификатор записи следующим образом:

Router.current().params._id
person sravanthi    schedule 08.01.2016

Я обычно использую так: В шаблоне:

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

В файле router.js:

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

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

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

Я думаю, что это простой способ, потому что он использует сеансы.

person StefanL19    schedule 08.01.2016