2016-02-01 5 views
1

У меня есть метеорный проект, где все мои пользователи имеют свои собственные настройки страницы профиля таким образом, используя маршруты:Добавление элементов коллекции в качестве маршрутов в Метеоре

Маршруты Код:

Router.route('/@:username', { 
    name: 'profile', 
    controller: 'ProfileController' 
}); 

ProfileController = RouteController.extend({ 
    template: 'profile', 
    waitOn: function() { 
    return Meteor.subscribe('userProfile', this.params.username); 
    }, 
    data: function() { 
    var username = Router.current().params.username; 
    return Meteor.users.findOne({ 
     username: username 
    }); 
    } 
}); 

Серверный код:

Meteor.publish('users', function() { 
    return Meteor.users.find({}, {fields: {username: 1, emails: 1, profile: 1, roles: 1}}); 
}); 

Meteor.publish('userProfile', function(username) { 
    // Try to find the user by username 
    var user = Meteor.users.findOne({ 
    username: username 
    }); 
    // If we can't find it, mark the subscription as ready and quit 
    if (!user) { 
    this.ready(); 
    return; 
    } 
    // If the user we want to display the profile is the currently logged in user 
    if(this.userId === user._id) { 
    // Then we return the curresonding full document via a cursor 
    return Meteor.users.find(this.userId); 
    } else { 

    return Meteor.users.find(user._id, { 
     fields: { 
     profile: 0 
     } 
    }); 
    } 
}); 

Я хочу сделать что-то подобное со страницей, которую я создал. При создании коллекционных работ и на странице сбора есть поле _id, созданное при создании.

Прямо сейчас программа отлично работает для пользователей, где работает mysite.com/@. Теперь я хочу, чтобы то же самое было для mysite.com/ &

В основном я пытался сделать то же самое, что и в приведенном выше коде, с именем пользователя, но он не работал. Я проверил, чтобы убедиться, что мое создание элементов коллекции работает, и они есть. Но почему-то я не могу понять, как сделать то же самое с коллекциями, поскольку я относительно новичок в использовании маршрутов.

Это то, что я пытался:

Вот мои маршруты: Код

var pageRoute = '/&:_id'; 
Router.route(pageRoute, { 
    name: 'page', 
    controller: 'PageController' 
}); 

PageController = RouteController.extend({ 
    template: 'page', 
    waitOn: function() { 
    return Meteor.subscribe('Page', this.params._id); 
    }, 
    data: function() { 
    var _id = Router.current().params._id; 
    return Meteor.pages.findOne({ 
     _id: _id 
    }); 
    } 
}); 

Сервера:

Meteor.publish('pages', function() { 
    return Pages.find({}); 
}); 

Meteor.publish('Page', function(_id) { 
    // Try find the page by _id 
    var page = Meteor.pages.findOne({ 
    _id: _id 
    }); 
    // If we can't find it, mark the subscription as ready and quit 
    if (!page) { 
    this.ready(); 
    return; 
    } 
    // If the page we want to display is not claimed, display it 
    if(true) { 
    return Meteor.pages.find(this._id); 
    } else { 
    // Redirect to the page 
    } 
}); 

Схема коллекция Страницы:

_id: , createdAt:, CreatedBy:, claimedAt:, claimedBy:,

Update:

Я его область видимости вниз к этой проблеме, я получаю следующее сообщение об ошибке в консоли на стороне сервера:

I20160202-11:16:24.644(2)? Exception from sub qrPage id 2kY6RKCTuCpBDbuzm TypeError: Cannot call method 'findOne' of undefined 
I20160202-11:16:24.645(2)?  at [object Object].process.env.MAIL_URL [as _handler] (server/ecclesia.life_server.js:40:33) 
I20160202-11:16:24.645(2)?  at maybeAuditArgumentChecks (livedata_server.js:1698:12) 
I20160202-11:16:24.645(2)?  at [object Object]._.extend._runHandler (livedata_server.js:1023:17) 
I20160202-11:16:24.645(2)?  at [object Object]._.extend._startSubscription (livedata_server.js:842:9) 
I20160202-11:16:24.646(2)?  at [object Object]._.extend.protocol_handlers.sub (livedata_server.js:614:12) 
I20160202-11:16:24.646(2)?  at livedata_server.js:548:43             

Этот ошибка возникает всякий раз, когда я пытаюсь направить на mysite.com/ & < _id>

+0

Я должен упомянуть, что имя пользователя материал отлично работает, я стараюсь, чтобы получить коллекцию страниц, созданных пользователями для работы. –

+0

# обозначает внутренний привязку страницы. –

+0

Думая об этом дальше - по умолчанию путь подтверждения электронной почты для учетных записей Meteor начинается с #. Сам Хатум написал об этом в своем ответе на [этот вопрос в железе-маршрутизаторе] (https://github.com/iron-meteor/iron-router/issues/3) –

ответ

0

Это заработало ...

Публикации:

Meteor.publish('qrpages', function() { 
    return QRPages.find({}); 
}); 

Meteor.publish('qrPage', function(id) { 
    // Try find the qrpage by _id 
    var qrpage = QRPages.find({_id: id}); 
    // If we can't find it, mark the subscription as ready and quit 
    if (!qrpage) { 
    this.ready(); 
    return; 
    } 
    return qrpage; 
}); 

Маршруты:

var qrpageRoute = '/$:_id'; 
Router.route(qrpageRoute, { 
    name: 'qrpage', 
    controller: 'QRController' 
}); 

QRController = RouteController.extend({ 
    template: 'qrpage', 
    waitOn: function() { 
    var id = this.params._id; 
    return Meteor.subscribe('qrPage', id); 
    }, 
    data: function() { 
    var id = this.params._id; 
    return QRPages.findOne({ 
     _id: id 
    }); 
    } 
}); 
0

На основании этого сайта: https://perishablepress.com/stop-using-unsafe-characters-in-urls/

Похоже, что # считается небезопасным символом для использования в строке URL. На веб-странице выше, похоже, есть несколько символов, которые вы можете использовать в качестве безопасных символов.

Я просто попробовал это на своей машине, и я не думаю, что Метеор прекрасно играет, когда # вводится в URL.

+0

Это очень полезно знать, это не изменило мою результаты, однако, опубликование редактирования того, что я пробовал. Я использую & вместо # сейчас. –

+0

Не так ли и зарезервированный персонаж? Пытаться ! или $ или _. –

+0

Знак @ работал отлично, и это в той же категории, что и ... Также в той же категории, что и $ –

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