Entendiendo las validaciones personalizadas de Rails

Abr 20, 2021
admin

Consideremos un requisito y luego entenderemos la necesidad de cada uno, o de cualquiera de ellos:

Consideremos que tenemos un modelo de artículos, con nombre de tabla como items , donde cada registro representa un paquete con atributos como title, description ,width, height, depth, y weight.

Cada artículo debe obedecer las siguientes reglas:

  • Queremos que el título tenga una longitud mínima de 10 caracteres, y cada título debe contener una palabra clave i.e. great-article .
  • El volumen del artículo debe estar entre 20 y 3000 metros cúbicos (es decir. Validación de volumen)
  • La compacidad del artículo no puede superar los 200 gramos por metros cúbicos (es decir, Compactness Validation)
  • Ninguna longitud de lado puede ser inferior al 15% del lado mayor (es decir, validación de proporción).

Ahora vamos a retomar la primera regla, con la primera aproximación

  • Utilizar un método personalizado para realizar la validación.

Hemos utilizado la primera aproximación para la validación personalizada, es decir, definir un método validar dentro de la clase del modelo.

Funciona bien, pero también añade más lógica al modelo. Es preferible extraer la lógica en una clase helper separada siempre que sea posible. Eso es porque, toda la lógica para una validación en particular se encapsula en su propio objeto, por lo que es fácil de depurar.

Validemos la densidad mediante el segundo enfoque, es decir, mediante la creación de una clase validadora helper. El método #validates_withproporcionado por rails apunta la validación a una clase helper:

class Item < ActiveRecord::Base

validates_with CompactnessValidator

end

Ahora necesitamos crear una clase helper CompactnessValidator

En el directorio /models/concerns, crea «compactness_validator.rb». El CompactnessValidator hereda de ActiveModel::Validator, cuya propiedad es que hay un método llamado #validate. Este método puede acceder a todo el registro. Y puede aplicar errores al registro si es necesario.

class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end

Nota, aquí podemos añadir n-número de validaciones en esta misma clase para varios atributos. por ejemplo, podemos incluso añadir validación para el título en esta clase.

por ejemplo.

Ahora vamos a utilizar el tercer enfoque de la definición de validaciones personalizadas.

Creando un ayudante de validación personalizado, podemos usarlo directamente igual que los incorporados por rails, simplemente diciendo, «item_dimensions_proportion:true».

class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end

Ahora como hemos puesto el indicador item_dimensions_proportion en true, rails esperará tener una clase ayudante para la validación llamada ItemDimensionsProportionValidator. Así que en el directorio concerniente a los modelos crea un archivo «item_dimensions_proportion_validator.rb».

Tenemos que definir un método #validates_eachpara facilitar la validación. Tomará cada atributo, y comprobará el valor de acuerdo con la lógica escrita en el método validate_each.

Usar validadores personalizados es un gran, si quieres extraer la validación relacionada con el código a una clase separada. Es realmente útil para depurar también como todo el código de validación para un modelo se encuentra en un solo lugar. También podemos incluso utilizar los mismos validadores para múltiples clases, lo que hace que sea realmente práctico e impresionante.

Prueba estos validadores personalizados en tus aplicaciones, y hazme saber si esto te ha ayudado de manera positiva. También puede llegar a mí en caso de cualquier problema @ [email protected].

También me gustaría aumentar mi número de lectores, por lo que amablemente le pedimos que lo comparta con usted amigos, compañeros, etc, si usted encuentra este blog helpful.

Thanks.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.