Подтвердить что ты не робот

Отдельная проверка формы с помощью Meteor

Я использую collection2, и я пытаюсь заставить его обрабатывать проверку, это особый способ. У меня есть схема профиля, которая выглядит примерно так:

Schema.UserProfile = new SimpleSchema({
    name: {
        type: String,
        optional: false
    }
    location: {
        type: String,
        optional: true
    }
    gender: {
        type: String,
        optional: false
    }
});

Schema.User = new SimpleSchema({
    username: {
        type: String,
        optional: true
    },
    emails: {
        type: Array,
        optional: true
    },
    "emails.$": {
        type: Object
    },
    "emails.$.address": {
        type: String,
        regEx: SimpleSchema.RegEx.Email
    },
    "emails.$.verified": {
        type: Boolean
    },
    createdAt: {
        type: Date
    },
    profile: {
        type: Schema.UserProfile,
        optional: true
    },
    services: {
        type: Object,
        optional: true,
        blackbox: true
    },
    roles: {
        type: [String],
        optional: true
    },
    heartbeat: {
        type: Date,
        optional: true
    }
});

Meteor.users.attachSchema(Schema.User);

Теперь, в моей регистрационной форме, я требую от пользователя выбрать свой пол, а затем, после того, как они войдут в систему, пользователям будет предоставлена ​​отдельная форма с указанием их имени и местоположения. Здесь проблема:

Регистрационная форма работает, и все происходит с сохранением. Когда они пытаются сохранить внутреннюю форму с указанием местоположения и имени, я получаю сообщение об ошибке:

Error invoking Method 'updateProfile': Gender is required [400]

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

4b9b3361

Ответ 1

Из Документов SimpleSchema:

Скажите, что у вас есть необходимый ключ "friends.address.city" , но "friends.address" не является обязательным. Если в папке "friends.address" установлено значение "friends.address" объект, который вы проверяете, но "friends.address.city" нет, есть ошибка проверки. Однако, если параметр "friends.address" не установлен, то для "friends.address.city" нет ошибки проверки, поскольку объект, к которому он принадлежит, отсутствует.

Таким образом, ошибка возникает из-за того, что вы включаете профиль в обе формы, а пол не является необязательным в профиле. Я могу подумать о двух способах решения этой проблемы:

  • У вас есть дополнительные объекты под профилем, которые являются необязательными и содержат обязательные поля для имени/местоположения на одном (хотя, похоже, местоположение может быть необязательным в обоих сценариях на основе вашего кода) и требуемое поле для пола на Другие. Мне не очень нравится это решение, но оно предотвращает необходимость проверки формы.

  • Использовать проверку формы jQuery (я использую пакет themeteorchef: jquery-validation) и сделать все ваши поля в профиле необязательными.

  • Также похоже, что SimpleSchema принимает функцию для свойства optional, поэтому вы можете использовать некоторую пользовательскую логику там - возможно, вы получаете аргументы или контекст в этой функции, которые позволят вам делать то, что вы хотите?

Надеюсь, что это поможет!

Ответ 2

Вы должны добавить проверку с помощью jquery или использовать тостер для отображения ошибки на стороне клиента. Прочтите также: ссылка

Ответ 3

Я предполагаю, что вы используете aldeed:autoform для своих форм. Когда вы используете normal type в форме, все поля, даже те, которые уже заполнены, помечены как обязательные, должны быть отправлены. Два способа исправить это:

  • Грязный путь: установите скрытое поле с предварительно заполненным значением.
  • Вы также можете установить свой тип формы как update как показано в документе. Таким образом, simple-schema проверит ваш newDoc, уже заполненный вашими предыдущими записями, без крика.

Решение номер два - это тот, который я использую в большинстве случаев. Этот плюс autoform hooks дает вам достаточную гибкость для адаптации к большинству случаев использования, которые могут возникнуть.

Ответ 4

Я не знаю, является ли это более элегантным решением, но мы перестали прикреплять simpleSchemas к документам в нашем текущем проекте.

Вместо этого у нас есть разные схемы в каждом пространстве имен коллекций, один для проверки ввода пользователя во вставке, один для обновления и один, который будет использоваться для заполнения defaultValue при вставке нового документа (который может быть выполнен либо клиентом, либо сервер, и в этом случае мы не проверяем ввод). Мы будем называть .validate() или .clean() в зависимости от того, что мы хотим сделать.

С умным использованием возможности построения схем из массива схем мы в конце концов не пишем больших схем (там больше их), но мы имеем полный контроль над тем, когда мы проверяем, и какие поля проверяются.