- PVSM.RU - https://www.pvsm.ru -

Meteor. Как же запилить этот ваш iron:router для CRUD?

Элементарно! Но если бы мне показали подобную инструкцию раньше…

Задание

По запросу /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/