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

в 9:02, , рубрики: coffeescript, crud, iron:router, Meteor, Meteor.JS

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

Задание

По запросу /profile без ключа отдаю страницу login, если пользователь «не того», иначе отдаю страницу на добавление newProfile или редактирование profile (editMode) своего профиля. А по запросу /profile/key отдаю страницу на просмотр profile (not editMode) любого профиля; при этом userId не светится, и неверные ключи отвергаются invalidProfile.

[исходник]

Решение

Создаю коллекцию.

@Collections.Profiles = new Meteor.Collection('profiles')

Карта роутера (название-путь).

Router.map ->
  @route 'profile',
    path: '/profile/:_id?'

Создаю роутер.

@ProfileController = RouteController.extend

Переменная с искомыми данными (нужна для передачи между двумя методами роутера).

  profile: null

Роутер будет ожидать объявленные подписки.

  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

Публикация подписок.

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
  ]

Правила доступа для коллекции.

@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.

Автор: comerc

Источник


* - обязательные к заполнению поля