如何知道哪个属性称为水线验证规则?

时间:2015-03-27 22:24:51

标签: validation sails.js models waterline

我正在对某些字段进行自己的自定义验证,因此只接受某些值(取决于字段),其余值被拒绝。我想写一个“过滤器”函数,它检查称为验证的属性,并从那里决定允许使用哪个单词。所以模型看起来像这样:

module.exports = {

    types: {

        filter: function(attribute) {

            if (attribute === 'number') {
                switch(attribute.value) {

                    case 'one':
                        return true;

                    case 'two':
                        return true;

                    default:
                        return false;

                }
            } else if (attribute === 'color') {
                switch(attribute.value) {

                    case 'red':
                        return true;

                    case 'blue':
                        return true;

                    default:
                        return false;

                }
           }

        },


    },

    attributes: {

        number: {
            type: 'string',
            required: true,
            filter: true
        },

        color: {
            type: 'string',
            required: true,
            filter: true
        }
    }
};

当然,在正常的Sails.js行为中,“attribute”不是属性,而是属性的值。(而attribute.value只是一个例如,意思是,我想要那里的属性值。

所以,我希望attribute成为调用验证规则的实际属性。 Sails有可能吗?我的意思是,我可以为模型中的每个字段编写一个函数,但是有一个适合所有字段的函数会很好(我有很多)。 / p>

感谢。

1 个答案:

答案 0 :(得分:1)

好的,我会回答你的问题,但这可能不是你想要的。属性可以有一个“枚举”,这就是我们实现最终目标的方式:

attributes: {
  state: {
    type: 'string',
    enum: ['pending', 'approved', 'denied']
  }
}

但是我会假设这段代码只是一个人为的例子。这是我认为可行的方式。

    module.exports = {
      
        

        types: {

            filter: function(attribute) {

                if (attribute === 'number') {
                    switch(attribute.value) {

                        case 'one':
                            return true;

                        case 'two':
                            return true;

                        default:
                            this.validationErrors.push(attribute);
                            return false;

                    }
                } else if (attribute === 'color') {
                    switch(attribute.value) {

                        case 'red':
                            return true;

                        case 'blue':
                            return true;

                        default:
                            this.validationErrors.push(attribute);
                            return false;

                    }
               }

            },


        },

        attributes: {
            validationErrors:(function(){
              
              var errors = [];
              
              return {
                push:function(attr){
                  errors.push(attr);
                },
                get:function(){
                  return errors;
                }
              };
              
            })(),

            number: {
                type: 'string',
                required: true,
                filter: true
            },

            color: {
                type: 'string',
                required: true,
                filter: true
            }
        }
    };

编辑:使用属性方法而不是属性

这个答案可能有几个问题。我不确定waterline如何在这些自定义类型函数中处理“this”。 “这个”是否与模型有关?或者我们正在创建的模型实例?这里有很多问题要问,但也许这可以给你一些想法并创建一个讨论。