Элементарно! Но если бы мне показали подобную инструкцию раньше…
По запросу /profile без ключа отдаю шаблон login, если пользователь «не того», иначе отдаю шаблон на добавление newProfile или редактирование profile (editMode) своего профиля. А по запросу /profile/key отдаю шаблон на просмотр profile (not editMode) любого профиля; при этом userId не светится, и неверные ключи отвергаются на invalidProfile.
[исходник]
Создаю коллекцию.
Карта роутера (путь-название).
Создаю роутер.
Переменная с искомыми данными (нужна для передачи между двумя методами роутера).
Роутер будет ожидать объявленные подписки.
Магия — реактивность.
Если в URL есть параметр, то подписка на просмотр коллекции.
Иначе если пользователь залогинен, то подписка на редактирование коллекции.
Обработка запроса к роутеру: получаю данные из коллекции и выбираю шаблон.
Передаю данные в шаблон на рендеринг.
Публикация подписок.
Правила доступа для коллекции.
PS Удаление не реализовано. Дедушка учил, что не надо ничего выкидывать, в хозяйстве все пригодится.
PSS Веселюсь на Метеоре с момента выхода релиза 1.0, настойчиво рекомендую. Несколько открытых проектов: браузерная игрушка, новостная лента, генератор форм, фреймворк для мобильников, интернет-магазин для мобильников, тудушечка, клон Trello, доска объявлений, учебник для челябинцев. Новости про Метеор на crater.io.
Задание
По запросу /profile без ключа отдаю шаблон login, если пользователь «не того», иначе отдаю шаблон на добавление newProfile или редактирование profile (editMode) своего профиля. А по запросу /profile/key отдаю шаблон на просмотр profile (not editMode) любого профиля; при этом userId не светится, и неверные ключи отвергаются на invalidProfile.
[исходник]
Решение
Создаю коллекцию.
@Collections.Profiles = new Mongo.Collection('profiles')
Карта роутера (путь-название).
Router.route '/profile/:_id?',
name: 'profile'
Создаю роутер.
@ProfileController = RouteController.extend
Переменная с искомыми данными (нужна для передачи между двумя методами роутера).
profile: null
Роутер будет ожидать объявленные подписки.
waitOn: ->
Магия — реактивность.
if Meteor.loggingIn()
# First, because twice exec. It is reactivity: http://docs.meteor.com/#/full/reactivity
# https://github.com/EventedMind/iron-router/blob/devel/Guide.md#reactivity
Если в URL есть параметр, то подписка на просмотр коллекции.
else if @params._id
return Meteor.subscribe 'profile4view', @params._id
Иначе если пользователь залогинен, то подписка на редактирование коллекции.
else if Meteor.userId()
return Meteor.subscribe 'profile4edit', Meteor.userId()
Обработка запроса к роутеру: получаю данные из коллекции и выбираю шаблон.
action: ->
@profile = null
if Meteor.loggingIn()
@template = 'wait'
else 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()
Передаю данные в шаблон на рендеринг.
data: ->
if not @profile
return
result =
editMode: not @params._id
profile: @profile
return result
Публикация подписок.
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
,
fields:
userId: 0
]
Правила доступа для коллекции.
@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 Веселюсь на Метеоре с момента выхода релиза 1.0, настойчиво рекомендую. Несколько открытых проектов: браузерная игрушка, новостная лента, генератор форм, фреймворк для мобильников, интернет-магазин для мобильников, тудушечка, клон Trello, доска объявлений, учебник для челябинцев. Новости про Метеор на crater.io.