A Rails egyéni érvényesítések megértése
Lássunk egy követelményt, majd értsük meg az egyes vagy bármelyik követelmény szükségességét:
Tegyük fel, hogy van egy Item modellünk, melynek táblázata items
, ahol minden rekord egy csomagot képvisel, melynek attribútumai: title
, description
,width
, height
, depth
, és weight.
Minden itemnek a következő szabályoknak kell megfelelnie:
- A címnek legalább 10 karakter hosszúságúnak kell lennie, és minden címnek tartalmaznia kell egy kulcsszót i.pl.
great-article
. - A tétel térfogatának 20 és 3000 köbméter között kell lennie (azaz. Térfogat érvényesítés)
- A tétel tömörsége nem haladhatja meg a 200 grammot köbméterenként (azaz
Compactness Validation
) - Az oldalhossz nem lehet kevesebb, mint a legnagyobb oldal 15%-a (azaz arány érvényesítés).
Most vegyük fel az első szabályt, az első megközelítéssel
- Egy saját metódust használunk az érvényesítés elvégzéséhez.
Az első legelső megközelítést használtuk az egyéni érvényesítéshez, azaz definiálunk egy validate metódust a modell osztályon belül.
Ez jól működik, de több logikát is ad a modellhez. Jobb, ha a logikát egy külön segédosztályba vonjuk ki, amikor csak lehetséges. Ez azért van így, mert egy adott érvényesítés összes logikája egy saját objektumba van kapszulázva, ami megkönnyíti a hibakeresést.
Validáljuk a sűrűséget a második megközelítéssel, azaz egy segéd validátor osztály létrehozásával. A rails által biztosított #validates_with
módszer egy segédosztályra irányítja az érvényesítést:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Most létre kell hoznunk egy segédosztályt CompactnessValidator
A /models/concerns könyvtárban hozzuk létre a “compactness_validator.rb” fájlt. A CompactnessValidator
örököl a ActiveModel::Validator
-tól, amelynek a sajátossága, hogy van egy #validate
nevű metódus. Ez a metódus a teljes rekordhoz hozzáférhet. És hibákat tud alkalmazni a rekordra, ha szükséges.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Megjegyezzük, hogy itt n-számú érvényesítést adhatunk hozzá ugyanabban az osztályban különböző attribútumokhoz. pl. akár a címhez is hozzáadhatunk érvényesítést ebben az osztályban.
pl.
Most használjuk a harmadik megközelítést az egyéni érvényesítések meghatározására.
Egy egyéni validátor segédosztály létrehozásával közvetlenül használhatjuk, akárcsak a rails beépített validátorokat, csak annyit kell mondanunk, hogy “item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Most mivel az item_dimensions_proportion flag-et true-ra állítottuk, a rails most elvárja, hogy legyen egy ItemDimensionsProportionValidator nevű segédosztály az érvényesítéshez. Tehát a models concern könyvtárban hozzunk létre egy “item_dimensions_proportion_validator.rb” fájlt.
Meg kell határoznunk egy #validates_each
metódust az érvényesítés megkönnyítésére. Ez minden egyes attribútumot fog venni, és a validate_each metódusba írt logika szerint fogja ellenőrizni az értéket.
A saját validátorok használata nagyszerű, ha az érvényesítéssel kapcsolatos kódot egy külön osztályba akarjuk kivonni. Ez nagyon hasznos a hibakeresésnél is, mivel a modell összes validációs kódja egy helyen található. Emellett akár több osztályhoz is használhatjuk ugyanazokat a validátorokat, ami igazán praktikussá és nagyszerűvé teszi.
Próbálja ki ezeket az egyéni validátorokat az alkalmazásaiban, és tudassa velem, ha ez pozitív módon segített Önnek. Szintén elérhetsz engem bármilyen probléma esetén @ [email protected].
Az olvasóközönségemet is szeretném növelni, ezért kérlek, hogy oszd meg barátaiddal, kollégáiddal, stb. ha hasznosnak találod ezt a blogot.
Köszönöm.