Förstå Rails anpassade valideringar
Låt oss tänka på ett krav och sedan förstå behovet av varje, eller någon av dessa:
Vi har en artikelmodell med tabellnamn items
, där varje post representerar ett paket med attribut som title
, description
,width
, height
, depth
och weight.
Varje artikel måste följa följande regler:
- Vi vill att titeln ska ha en längd på minst 10 tecken och att varje titel ska innehålla ett nyckelord i.e.
great-article
. - Volymen av artikeln måste vara mellan 20 och 3000 kubikmeter (dvs. Volymvalidering)
- Artiklens kompakthet får inte överstiga 200 gram per kubikmeter (dvs.
Compactness Validation
) - Ingen sidlängd får vara mindre än 15 % av den största sidan (dvs. proportionsvalidering).
Nu tar vi upp den första regeln, med första tillvägagångssättet
- Använd en anpassad metod för att utföra valideringen.
Vi har använt oss av det allra första tillvägagångssättet för anpassad validering, det vill säga att definiera en validera-metod inne i modellklassen.
Det fungerar bra, men det lägger också till mer logik i modellen. Det är att föredra att extrahera logiken i en separat hjälpklass när det är möjligt. Det beror på att all logik för en viss validering kapslas in i ett eget objekt, vilket gör det lätt att felsöka.
Låt oss validera tätheten med hjälp av det andra tillvägagångssättet, dvs. genom att skapa en hjälpklass för validering. Den #validates_with
metod som tillhandahålls av rails pekar valideringen till en hjälpklass:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Nu måste vi skapa en hjälpklass CompactnessValidator
I katalogen /models/concerns skapar du ”compactness_validator.rb”. CompactnessValidator
ärver från ActiveModel::Validator
, vars egenskap är att det finns en metod som heter #validate
. Denna metod kan få tillgång till hela posten. Och kan tillämpa fel på posten om det behövs.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Notera, här kan vi lägga till n-antal valideringar i samma klass för olika attribut. t.ex. kan vi till och med lägga till validering för titel i den här klassen.
till exempel.
Nu kan vi använda det tredje tillvägagångssättet för att definiera anpassade valideringar.
Vid skapandet av en egen hjälpklass för validering kan vi direkt använda den precis som de inbyggda i Rails, bara genom att säga ”item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Nu när vi har ställt in flaggan item_dimensions_proportion till true, förväntar sig Rails nu att det finns en hjälpklass för validering som heter ItemDimensionsProportionValidator. Så i models concern-katalogen skapar du en fil ”item_dimensions_proportion_validator.rb”.
Vi måste definiera en #validates_each
metod för att underlätta valideringen. Den tar varje attribut och kontrollerar värdet enligt den logik som skrivs i validate_each-metoden.
Användning av anpassade validatorer är bra om du vill extrahera den valideringsrelaterade koden till en separat klass. Det är också till stor hjälp vid felsökning eftersom all valideringskod för en modell ligger på ett och samma ställe. Dessutom kan vi även använda samma validatorer för flera klasser, vilket gör det riktigt praktiskt och häftigt.
Prova dessa anpassade validatorer i dina appar och låt mig veta om detta har hjälpt dig på ett positivt sätt. Du kan också kontakta mig om du har några frågor @ [email protected].
Jag skulle också vilja öka min läsekrets, så jag ber dig vänligen att dela den med dina vänner, kollegor etc. om du tycker att den här bloggen är till hjälp.
Tack.