Pull to refresh

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

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

Задание


По запросу /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.
Tags:
Hubs:
Total votes 23: ↑19 and ↓4+15
Comments18

Articles