Comprendre les validations personnalisées de Rails
Envisageons un besoin et comprenons ensuite le besoin de chacun, ou de l’un d’entre eux :
Sidérons que nous avons un modèle d’article, avec un nom de table comme items
, où chaque enregistrement représente un paquet avec des attributs comme title
, description
,width
, height
, depth
, et weight.
Chaque article doit obéir aux règles suivantes:
- Nous voulons que le titre soit d’une longueur minimale de 10 caractères, et que chaque titre contienne un mot clé i.e.
great-article
. - Le volume de l’article doit être compris entre 20 et 3000 mètres cubes (ie. Validation du volume)
- La compacité de l’article ne peut pas dépasser 200 grammes par mètres cubes (ie.
Compactness Validation
) - Aucune longueur de côté ne peut être inférieure à 15% du plus grand côté (ie. validation des proportions).
Reprenons maintenant la première règle, avec la première approche
- Utiliser une méthode personnalisée pour effectuer la validation.
Nous avons utilisé la toute première approche pour la validation personnalisée, c’est-à-dire définir une méthode de validation à l’intérieur de la classe du modèle.
Cela fonctionne bien, mais cela ajoute aussi plus de logique au modèle. Il est préférable d’extraire la logique dans une classe d’aide séparée lorsque cela est possible. C’est parce que, toute la logique pour une validation particulière est encapsulée dans son propre objet, ce qui facilite le débogage.
Validons la densité en utilisant la deuxième approche c’est-à-dire en créant une classe de validateur d’aide. La #validates_with
méthode fournie par rails pointe la validation vers une classe d’aide :
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Maintenant, nous devons créer une classe d’aide CompactnessValidator
Dans le répertoire /models/concerns, créez « compactness_validator.rb ». La CompactnessValidator
hérite de ActiveModel::Validator
, dont la propriété est d’avoir une méthode appelée #validate
. Cette méthode peut accéder à l’enregistrement entier. Et peut appliquer des erreurs à l’enregistrement si nécessaire.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Note, ici nous pouvons ajouter n-nombre de validations dans cette même classe pour divers attributs. Par exemple, nous pouvons même ajouter une validation pour le titre dans cette classe.
par exemple.
Maintenant, utilisons la troisième approche de définition de validations personnalisées.
En créant une aide de validateur personnalisé, nous pouvons directement l’utiliser comme ceux intégrés par rails, juste en disant, « item_dimensions_proportion:true ».
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Maintenant que nous avons mis le drapeau item_dimensions_proportion à true, rails va maintenant s’attendre à avoir une classe d’aide pour la validation nommée ItemDimensionsProportionValidator. Donc, dans le répertoire de préoccupation des modèles, créez un fichier « item_dimensions_proportion_validator.rb ».
Nous devons définir une #validates_each
méthode pour faciliter la validation. Elle prendra chaque attribut, et vérifiera la valeur selon la logique écrite dans la méthode validate_each.
L’utilisation de validateurs personnalisés est une excellente, si vous voulez extraire la validation liée au code à une classe séparée. C’est vraiment utile pour déboguer aussi car tout le code de validation pour un modèle se trouve à un seul endroit. En outre, nous pouvons même utiliser les mêmes validateurs pour plusieurs classes, ce qui le rend vraiment pratique et génial.
Essayez ces validateurs personnalisés dans vos applications, et faites-moi savoir si cela vous a aidé de manière positive. Vous pouvez également me joindre en cas de problème @ [email protected].
J’aimerais également augmenter mon lectorat, donc je vous demanderais gentiment de le partager avec vos amis, vos pairs, etc, si vous trouvez ce blog utile.
Merci.