不要怂,就是干,撸起袖子干!

Commit f5066366 by Sascha Gehlich

Validation skipping logic was inverted. Fixed #1169

1 parent f5d6065f
...@@ -870,9 +870,14 @@ module.exports = (function() { ...@@ -870,9 +870,14 @@ module.exports = (function() {
options.fields = newFields || options.fields options.fields = newFields || options.fields
if (options.validate === true) { if (options.validate === true) {
if (options.fields.length) {
var skippedFields = Utils._.difference(Object.keys(self.attributes), options.fields);
}
if (options.hooks === true) { if (options.hooks === true) {
var iterate = function(i) { var iterate = function(i) {
daos[i].hookValidate({skip: options.fields}).error(function(err) {
daos[i].hookValidate({skip: skippedFields}).error(function(err) {
errors[errors.length] = {record: v, errors: err} errors[errors.length] = {record: v, errors: err}
i++ i++
if (i > daos.length) { if (i > daos.length) {
...@@ -887,7 +892,7 @@ module.exports = (function() { ...@@ -887,7 +892,7 @@ module.exports = (function() {
} }
} else { } else {
daos.forEach(function(v) { daos.forEach(function(v) {
var valid = v.validate({skip: options.fields}) var valid = v.validate({skip: skippedFields})
if (valid !== null) { if (valid !== null) {
errors[errors.length] = {record: v, errors: valid} errors[errors.length] = {record: v, errors: valid}
} }
...@@ -1145,7 +1150,12 @@ module.exports = (function() { ...@@ -1145,7 +1150,12 @@ module.exports = (function() {
if (options.validate === true) { if (options.validate === true) {
var build = self.build(attrValueHash) var build = self.build(attrValueHash)
build.hookValidate({skip: Object.keys(attrValueHash)}).error(function(err) {
// We want to skip validations for all other fields
var updatedFields = Object.keys(attrValueHash)
var skippedFields = Utils._.difference(Object.keys(self.attributes), updatedFields)
build.hookValidate({skip: skippedFields}).error(function(err) {
emitter.emit('error', err) emitter.emit('error', err)
}).success(function(attributes) { }).success(function(attributes) {
if (!!attributes && !!attributes.dataValues) { if (!!attributes && !!attributes.dataValues) {
......
...@@ -71,7 +71,7 @@ var validateAttributes = function() { ...@@ -71,7 +71,7 @@ var validateAttributes = function() {
Utils._.each(this.model.rawAttributes, function(rawAttribute, field) { Utils._.each(this.model.rawAttributes, function(rawAttribute, field) {
var value = self.model.dataValues[field] || undefined var value = self.model.dataValues[field] || undefined
, hasAllowedNull = ((rawAttribute === undefined || rawAttribute.allowNull === true) && ((value === null) || (value === undefined))) , hasAllowedNull = ((rawAttribute === undefined || rawAttribute.allowNull === true) && ((value === null) || (value === undefined)))
, isSkipped = self.options.skip.length > 0 && self.options.skip.indexOf(field) === -1 , isSkipped = self.options.skip.length > 0 && self.options.skip.indexOf(field) !== -1
if (self.model.validators.hasOwnProperty(field) && !hasAllowedNull && !isSkipped) { if (self.model.validators.hasOwnProperty(field) && !hasAllowedNull && !isSkipped) {
errors = Utils._.merge(errors, validateAttribute.call(self, value, field)) errors = Utils._.merge(errors, validateAttribute.call(self, value, field))
......
...@@ -562,5 +562,24 @@ describe(Support.getTestDialectTeaser("DaoValidator"), function() { ...@@ -562,5 +562,24 @@ describe(Support.getTestDialectTeaser("DaoValidator"), function() {
expect(errors.field).to.have.length(1) expect(errors.field).to.have.length(1)
expect(errors.field[0]).to.equal("Unexpected value or invalid argument: field") expect(errors.field[0]).to.equal("Unexpected value or invalid argument: field")
}) })
it('skips validations for the given fields', function() {
var values = ['value1', 'value2']
var Bar = this.sequelize.define('Bar' + config.rand(), {
field: {
type: Sequelize.ENUM,
values: values,
validate: {
isIn: [values]
}
}
})
var failingBar = Bar.build({ field: 'value3' })
, errors = failingBar.validate({ skip: ['field'] })
expect(errors).to.be.null
})
}) })
}) })
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!