Tengo un formulario para crear un lugar. Dependiendo del país, se requiere o no el campo de provincia (estado, región).Validación validada condicional de Grails o validador personalizado con opción de nulidad
Cuando no es obligatorio, quiero ser una cadena nula, no vacía. Tengo código que hace que todos los campos vacíos, nulo:
def newparams = [:]
place = new Place()
params.each() { k, v ->
if (v instanceof String && place.hasProperty(k)) {
if (!v.trim().length()) {
newparams[k] = null
} else {
newparams[k] = v
}
}
}
place = new Place(newparams)
place.validate()
Ahora, en el dominio del lugar, tengo un validador en la provincia:
province validator: {val, obj -> if (obj.country in obj.requiresRegionCountries() && !obj.province) return [province.required]}
Con esta regla, siempre sale "provincia no puede ser nulo "incluso si se requiere o no.
Creo que esto se debe a que el validador que admite nulos esta predeterminado a falso.
Si estoy añadiendo anulable: verdad, entonces incluso si es necesario provincia, el validador propio se omite y se puede guardar con la provincia de vacío (creo que es porque se crea una instancia con nula)
Ahora , necesito de alguna manera mi validador de encargo y también la capacidad para especificar el anulable en mi validador, algo como esto:
province validator: {val, obj ->
if (obj.country in obj.requiresRegionCountries() && !obj.province) {
nullable: false
return [province.required] }
else {
nullable: true
}
}
¿Cómo puedo lograr esto en Grails 2.0.3?
Gracias por su respuesta, pero hay un problema. Si configuro para ser nulo y place.province es nulo, entonces la validación personalizada se omite por completo. Quiero ser nullable para algunos países pero no para los demás. – Eduard
Para ser claros: si no pongo el valor de nulos como verdadero y el archivo es nulo, el error "No puede ser nulo" se inicia y mi validador personalizado no se ejecuta. Si agrego nullable: true y el valor es nulo, la validación pasará, mi validador personalizado no se ejecutará. Quiero ser nulo para algunos países y no nulo para otros. Esto es algo que no puedo hacer con el comportamiento actual. – Eduard
Quizás sea un error de Grails 2.0.3. Estoy ejecutando 2.0.4 y me funciona con un simple proyecto de demostración que creé que pegaré en mi respuesta anterior para que pueda comparar – Tri