Отдельная проверка формы с помощью 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]
Я знаю, что это происходит, потому что это требуется в схеме, но я уже получил эту информацию. Как мне этого не нужно? Или я устанавливаю валидацию для каждой формы?
Ответы
Ответ 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() в зависимости от того, что мы хотим сделать.
С умным использованием возможности построения схем из массива схем мы в конце концов не пишем больших схем (там больше их), но мы имеем полный контроль над тем, когда мы проверяем, и какие поля проверяются.