Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Динамическая валидация. #9

Closed
rsam opened this issue Jun 14, 2015 · 6 comments
Closed

Динамическая валидация. #9

rsam opened this issue Jun 14, 2015 · 6 comments
Labels
Milestone

Comments

@rsam
Copy link

rsam commented Jun 14, 2015

Добрый день.

А может ли данное описание использоваться для динамической валидации?

Например у нас есть два поля:
type_of_data - тип данных (цифра, строка)
value - значение, если цифра то от 1 до 100
если строка то от 1 до 3 символов

По типу данных все понятно:
type_of_data : { one_of('digital', 'string') },

Но вот как описать правила для значений через условие?
Типа:
Если type_of_data eq 'digital' то value : {number_between(1,100)}
Если type_of_data eq 'string' то value : {length_between(1,3)}

@koorchik
Copy link
Owner

Тут есть 2 варианта:

  1. Делать руками. То есть, смотреть на поле type_of_data и руками передавать нужные правила в валидатор.
  2. Создать правило, которое смотрим на поле и применяет разные правила в зависимости от значения поля type_of_data. Есть стандартное правило list_of_different_objects - по сути, оно это и делает. Смотрит на поле и на его значения, в завимости от значения использует нужные правила валидации. Вот пример

Также сегодня опубликовал пост на хабре - http://habrahabr.ru/post/246521/ , в котором описал механизм создания кастомных правил

@amakhrov
Copy link
Contributor

Возник тот же вопрос.
Вариант 2 не совсем подходит, потому что у нас нет "списка" разных объектов - у нас только один объект на верхнем уровне.

@koorchik
Copy link
Owner

Обычно в каждом проекте есть какие-то индивидуальные требования и каждый проект содержит библиотеку с набором своих специфических правил. Например, правило для вашего случая:

var LIVR = require('livr');

var dynamicObject = function(selectorField, livrs, ruleBuilders) {
    var validators = {};

    for (var selectorValue in livrs) {
        var validator = new LIVR.Validator(livrs[selectorValue]).registerRules(ruleBuilders).prepare();
        validators[selectorValue] = validator;
    }

    return function(object, params, outputArr) {
        if ( object === undefined || object === null || object === '' ) return;
        if ( typeof object !== 'object' ) return 'FORMAT_ERROR';

        var validator = validators[ object[selectorField] ];

        if (!validator) {
            var error = {};
            error[selectorField] = 'NOT_SUPPORTED';
            return error;
        };

        var result = validator.validate( object );

        if ( result ) {
            outputArr.push(result);
            return;
        } else {
            return validator.getErrors();
        }
    }
}

LIVR.Validator.registerDefaultRules({ dynamic_object: dynamicObject });

var validator = new LIVR.Validator({
    dynamicData: [{ dynamic_object: ['type', {
        string: { 'value': [ 'required', {'min_length': 10} ] },
        number: { 'value': [ 'required', 'positive_integer' ] }
    }]}]
});

var validData = validator.validate({
    dynamicData: {
        type: 'string',
        value: 'qwert'
    }
});
console.log('errors', validator.getErrors());


var validData = validator.validate({
    dynamicData: {
        type: 'number',
        value: 'qwert'
    }
});
console.log('errors', validator.getErrors());

@DanielHreben
Copy link
Contributor

У меня тоже недавно был такой кейс. Правило действительно похоже на "list_of_different_objects", (только для одного объекта) логично было бы увидеть его в стандартной поставке.

@koorchik
Copy link
Owner

Если это реально востребованный кейс, то можно добавить его в спеку. Пока переоткрываю и отмечаю, как proposal. Также привествуются альтернативные решения данной проблемы

@koorchik koorchik reopened this Jun 29, 2015
@koorchik koorchik added this to the v0.5 milestone Dec 28, 2015
@koorchik koorchik mentioned this issue Dec 28, 2015
@koorchik
Copy link
Owner

Added to spec. Will be available when updated spec is published. Rule name will be "variable_object"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants