- PVSM.RU - https://www.pvsm.ru -
Элементарно! Но если бы мне показали подобную инструкцию раньше…
По запросу /profile без ключа отдаю страницу login, если пользователь «не того», иначе отдаю страницу на добавление newProfile или редактирование profile (editMode) своего профиля. А по запросу /profile/key отдаю страницу на просмотр profile (not editMode) любого профиля; при этом userId не светится, и неверные ключи отвергаются invalidProfile.
[исходник [1]]
Создаю коллекцию [2].
@Collections.Profiles = new Meteor.Collection('profiles')
Карта роутера (название-путь).
Router.map ->
@route 'profile',
path: '/profile/:_id?'
Создаю роутер [3].
@ProfileController = RouteController.extend
Переменная с искомыми данными (нужна для передачи между двумя методами роутера).
profile: null
Роутер будет ожидать объявленные подписки [4].
waitOn: ->
Если в URL есть параметр, то подписка на просмотр коллекции.
if @params._id
Meteor.subscribe 'profile4view', @params._id
Иначе если пользователь залогинен, то подписка на редактирование коллекции.
else if Meteor.userId()
Meteor.subscribe 'profile4edit', Meteor.userId()
Обработка запроса к роутеру: получаю данные из коллекции и выбираю шаблон.
action: ->
if @params._id
@profile = Collections.Profiles.findOne {_id: @params._id}
if @profile
# @template = 'profile'
else
@template = 'invalidProfile'
else if Meteor.userId()
@profile = Collections.Profiles.findOne {userId: Meteor.userId()}
if @profile
# @template = 'profile'
else
@template = 'newProfile'
else
@template = 'login'
@render()
Передаю данные в шаблон на рендеринг (шаблон 'profile' по умолчанию — это имя роутера).
data: ->
if not @ready() or @template in ['login', 'invalidProfile', 'newProfile']
return
if true # @template is 'profile'
result =
editMode: not @params._id
profile: @profile
return result
Публикация подписок [4].
Meteor.publish 'profile4edit', (userId) ->
check(arguments, [Match.Any])
[
Collections.Profiles.find
userId: userId
]
Meteor.publish 'profile4view', (id) ->
check(arguments, [Match.Any])
[
Collections.Profiles.find
_id: id
]
Правила доступа [5] для коллекции.
@Collections.Profiles.allow
insert: (userId, doc) ->
userId and doc and userId is doc.userId
update: (userId, doc, fieldNames, modifier) ->
userId and doc and userId is doc.userId
# remove: (userId, doc) ->
# userId and doc and userId is doc.userId
fetch: ['userId']
PS Удаление не реализовано. Дедушка учил, что не надо ничего выкидывать, в хозяйстве все пригодится.
PSS Веселюсь [6] на Метеоре с момента выхода версии 1.0, настойчиво рекомендую. Несколько открытых проектов: браузерная игрушка [7], новостная лента [8], генератор форм [9], фреймворк для мобильников [10], интернет-магазин для мобильников [11], тудушечка [12], клон Trello [13], доска объявлений [14], учебник для челябинцев [15]. Новости о Метеоре на crater.io [16].
Автор: comerc
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/crud/79525
Ссылки в тексте:
[1] исходник: https://gist.github.com/comerc/463edb3cf1527942a25a
[2] коллекцию: http://ru.discovermeteor.com/chapters/collections/
[3] роутер: http://ru.discovermeteor.com/chapters/routing/
[4] подписки: http://ru.discovermeteor.com/chapters/publications-and-subscriptions/
[5] Правила доступа: http://ru.discovermeteor.com/chapters/allow-and-deny/
[6] Веселюсь: https://github.com/comerc
[7] браузерная игрушка: http://dominusgame.net/
[8] новостная лента: http://www.telesc.pe/
[9] генератор форм: http://autoform.meteor.com/
[10] фреймворк для мобильников: http://meteoric.github.io/
[11] интернет-магазин для мобильников: https://github.com/meteor/meteor/tree/devel/examples/localmarket
[12] тудушечка: http://todos.meteor.com/
[13] клон Trello: https://github.com/libreboard/libreboard
[14] доска объявлений: https://github.com/nate-strauser/wework
[15] учебник для челябинцев: https://bulletproofmeteor.com/
[16] crater.io: http://crater.io/
[17] Источник: http://habrahabr.ru/post/247849/
Нажмите здесь для печати.