Forståelse af Rails brugerdefinerede valideringer
Lad os overveje et krav og derefter forstå behovet for hver enkelt eller en af disse:
Lad os overveje, at vi har en Item model, med tabelnavn som items
, hvor hver post repræsenterer en pakke med attributter som title
, description
,width
, height
, depth
og weight.
Hvert emne skal overholde følgende regler:
- Vi ønsker, at titlen skal have en minimumslængde på 10 tegn, og at hver titel skal indeholde et nøgleord i.e.
great-article
. - Volumenet af varen skal være mellem 20 og 3000 kubikmeter (dvs. Volumenvalidering)
- Postens kompakthed må ikke overstige 200 gram pr. kubikmeter (dvs.
Compactness Validation
) - Ingen sidelængde må være mindre end 15 % af den største side (dvs. Proportionsvalidering).
Nu skal vi samle op på den første regel, med første tilgang
- Brug en brugerdefineret metode til at udføre valideringen.
Vi har brugt den allerførste tilgang til brugerdefineret validering, dvs. definere en validere-metode inde i modelklassen.
Det fungerer fint, men det tilføjer også mere logik til modellen. Det er at foretrække at udtrække logikken i en separat hjælperklasse, når det er muligt. Det skyldes, at al logikken for en bestemt validering er indkapslet i sit eget objekt, hvilket gør det nemt at fejlfinde.
Lad os validere tætheden ved hjælp af den anden metode, dvs. ved at oprette en hjælpevalideringsklasse. Den #validates_with
metode, der leveres af rails, peger valideringen til en hjælperklasse:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Nu skal vi oprette en hjælperklasse CompactnessValidator
I mappen /models/concerns skal du oprette “compactness_validator.rb”. CompactnessValidator
arver fra ActiveModel::Validator
, hvis egenskab er, at der skal være en metode kaldet #validate
. Denne metode kan få adgang til hele posten. Og kan anvende fejl på posten, hvis det er nødvendigt.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Bemærk, her kan vi tilføje n-antal valideringer i denne samme klasse for forskellige attributter. f.eks. kan vi endda tilføje validering for titel i denne klasse.
for eksempel.
Nu kan vi bruge den tredje tilgang til at definere brugerdefinerede valideringer.
Ved at oprette en brugerdefineret validator-hjælper kan vi direkte bruge den ligesom de indbyggede i rails, blot ved at sige “item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Nu, da vi har sat item_dimensions_proportion-flaget til true, vil rails nu forvente at have en hjælperklasse til validering ved navn ItemDimensionsProportionValidator. Så i models concern-mappen opretter vi en fil “item_dimensions_proportion_validator.rb”.
Vi skal definere en #validates_each
metode for at lette valideringen. Den vil tage hver attribut og kontrollere værdien i henhold til den logik, der er skrevet i validate_each-metoden.
Det er godt at bruge brugerdefinerede validatorer, hvis du ønsker at udtrække valideringsrelateret kode til en separat klasse. Det er også meget nyttigt til fejlfinding, da al valideringskoden for en model ligger ét sted. Vi kan også selv bruge de samme validatorer til flere klasser, hvilket gør det virkelig praktisk og fantastisk.
Afprøv disse brugerdefinerede validatorer i dine apps, og lad mig vide, om det har hjulpet dig på en positiv måde. Du kan også nå ud til mig i tilfælde af problemer @ [email protected].
Jeg vil også gerne øge min læserskare, så jeg vil venligst bede dig om at dele det med dig venner, kolleger osv., hvis du finder denne blog nyttig.
Thanks.