Inzicht in Rails Custom Validations
Laten we een vereiste overwegen en dan de noodzaak van elk, of een van deze, begrijpen:
Laten we eens kijken naar een Item model, met tabelnaam items
, waar elk record een pakket vertegenwoordigt met attributen als title
, description
, width
, height
, depth
, en weight.
Elk item moet aan de volgende regels voldoen:
- We willen dat de titel minimaal 10 karakters lang is, en elke titel moet een trefwoord bevatten, nl.b.v.
great-article
. - Het volume van het item moet tussen 20 en 3000 kubieke meter liggen (d.w.z. Volume validatie)
- De compactheid van het item mag niet meer dan 200 gram per kubieke meter bedragen (d.w.z.
Compactness Validation
) - Geen lengte van de zijde mag minder dan 15% van de grootste zijde bedragen (d.w.z. proportie validatie).
Nu gaan we de eerste regel oppakken, met de eerste aanpak
- Gebruik een aangepaste methode om de validatie uit te voeren.
We hebben de allereerste aanpak voor aangepaste validatie gebruikt, namelijk een validatiemethode definiëren binnen de modelklasse.
Het werkt prima, maar het voegt ook meer logica toe aan het model. Het verdient de voorkeur om de logica in een aparte helper klasse wanneer mogelijk. Dat komt omdat alle logica voor een bepaalde validatie is ingekapseld in een eigen object, waardoor het gemakkelijk te debuggen.
Laten we de dichtheid valideren door gebruik te maken van de tweede benadering, d.w.z. door het creëren van een helper validator klasse. De #validates_with
methode van rails wijst de validatie naar een hulpklasse:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Nu moeten we een hulpklasse maken CompactnessValidator
In de map /models/concerns moet je “compactness_validator.rb” maken. De CompactnessValidator
erft van ActiveModel::Validator
, waarvan de eigenschap is dat er een methode #validate
wordt genoemd. Deze methode heeft toegang tot het hele record. En kan fouten toe te passen op het record indien nodig.
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, hier kunnen we n-aantal validaties toe te voegen in deze dezelfde klasse voor verschillende attributen. bv. we kunnen zelfs toevoegen validatie voor titel in deze klasse.
voor bv.
Nou laten we gebruik maken van de derde benadering van het definiëren van aangepaste validaties.
Door het creëren van een aangepaste validator helper, kunnen we direct gebruik maken van het net als rails ingebouwde, gewoon door te zeggen, “item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Nu als we item_dimensions_proportion vlag hebben ingesteld op true, zal rails nu verwachten dat een helper klasse voor validatie met de naam ItemDimensionsProportionValidator hebben. Maak dus in de models concern directory een bestand “item_dimensions_proportion_validator.rb”.
We moeten een #validates_each
methode definiëren om de validatie te vergemakkelijken. Het zal elk attribuut nemen, en zal de waarde controleren volgens de logica geschreven in de validate_each methode.
Het gebruik van aangepaste validators is een geweldig, als je de validatie gerelateerde code in een aparte klasse wilt onderbrengen. Het is echt handig om te debuggen ook als alle validatie code voor een model ligt op een plaats. Ook kunnen we zelfs dezelfde validaties gebruiken voor meerdere klassen, wat het echt handig en geweldig maakt.
Probeer deze aangepaste validaties in je apps, en laat me weten of dit je heeft geholpen op een positieve manier. Ook kunt u contact met mij op in geval van een probleem @ [email protected].
Ik zou ook graag mijn lezerspubliek te vergroten, dus zou u vriendelijk verzoeken om het te delen met u vrienden, collega’s, etc, als u vindt deze blog helpful.
Thanks.