Как добавить информацию об идентификаторе пользователя в схему, а также скрыть автоформы форм?

Я изучаю веревки Метеора и немного потерялся здесь. Я использую collections2, autoform для создания своего приложения. Я хочу сохранить коллекцию вместе с информацией об идентификаторе пользователя. Так что, когда мы получаем коллекцию с сервера, я хочу показать только те, которые создал пользователь, а не все остальное. вот схема.

    ExercisesSchema = new SimpleSchema({
    "name": {
        type: String,
        label: 'Name'
    },
    "workout.$.weight": {
        type: String,
        label: 'Weight'
    },
    "workout.$.reps": {
        type: String,
        label: 'Reps'
    },
    "notes": {
        type: String,
        label: 'Notes',
        optional: true
    }
});

на стороне сервера я хочу показывать только тренировки, созданные пользователем

Meteor.publish('exercises', function () {
    return Exercises.find({owner: this.userId});
});

Когда я добавил идентификатор пользователя в схему, он отображается в автоформе, я не знаю, как его скрыть, если я его скрою, то, возможно, я смогу использовать хуки в автоформе для добавления значений?


person Nair    schedule 28.10.2015    source источник


Ответы (2)


В схеме вы можете определить ownerId как тип: «скрытый»

схема.js

ExercisesSchema = new SimpleSchema({
    "name": {
        type: String,
        label: 'Name'
    },
    "ownerId": {
        type: String,
        autoform: {
            type: "hidden",
        }
    },
    "workout": {
        //not sure if you need this, you didn't have it in your
        type: [Object], 
        defaultValue: [] 
    },
    "workout.$.weight": {
        type: String,
        label: 'Weight'
    },
    "workout.$.reps": {
        type: String,
        label: 'Reps'
    },
    "notes": {
        type: String,
        label: 'Notes',
        optional: true
    }
});

И заполните его крючками, как вы сказали.

autoFormHooks.js

AutoForm.hooks({
  exerciseForm: {
    formToDoc: function(doc) {
      doc.ownerId = Meteor.userId();
      return doc
    },
  }
});

Альтернативой использованию ловушек может быть использование quickFields внутри вашей автоформы для каждого поля, которое вы хотите установить в документе, включая ownerId. С помощью этого решения вы должны установить value для ownerId на currentUser.

{{#autoForm collection="Exercises" id="exerciseForm" type="insert"}}
  <fieldset>
    <legend>Add an Exercise</legend>
    {{> afQuickField name='name'}}
    {{> afQuickField name='notes'}}
    {{> afQuickField name='ownerId' value=currentUserId}}
    {{> afQuickField name='workout'}}
  </fieldset>
  <button type="submit" class="btn btn-primary">Insert</button>
{{/autoForm}}

template.js

Template.formTemplate.helpers({
    currentUserId: function () {
        return Meteor.userId();
    }
});
person challett    schedule 28.10.2015
comment
У вас есть какие-либо идеи, что могло вызвать следующую ошибку: Ошибка: Недопустимое определение для поля ownerId. Если я удалю определение автоформы, ошибка исчезнет. При добавлении автоформы в схему возвращается ошибка. Я установил простую схему, collection2 и autoform. - person Nair; 28.10.2015
comment
@challett Следуя описанному выше подходу, я сразу сохраняю два объекта в коллекцию. Удаление autoFormHooks.js решает эту проблему - person KhoPhi; 17.12.2015

Вы можете попробовать подход before крюка:

ExercisesSchema = new SimpleSchema({
...
    "ownerId": {
        type: String,
        autoform: {
            type: "hidden",
        }
    },
...
});

В вашем шаблоне:

{{#autoForm collection="Exercises" id="exerciseForm" type="insert"}}
  <fieldset>
    <legend>Add an Exercise</legend>
    {{> afQuickField name='name'}}
    {{> afQuickField name='notes'}}
    <!-- Notice I've removed the ownerId from here. Will be added before saving to collection -->
    {{> afQuickField name='workout'}}
  </fieldset>
  <button type="submit" class="btn btn-primary">Insert</button>
{{/autoForm}}

Тогда ваш autoform.js

var addUserHook = {
  before: {
    insert: function(doc) {
      if(Meteor.userId()){
        doc.ownerId = Meteor.userId();
      }

      return doc;
    }
  }
}

AutoForm.addHooks('exerciseForm', addUserHook);

Вышеупомянутый добавляет ownerId на лету, как раз перед сохранением в коллекцию.

Как указано в документах на atmospherejs.com/aldeed/autoform:

Например, вы можете захотеть добавить идентификатор текущего пользователя в документ перед его вставкой. Для этого вы можете использовать хуки «before», «formToDoc» или «formToModifier».

person KhoPhi    schedule 16.12.2015