A Rails egyéni érvényesítések megértése

ápr 20, 2021
admin

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_withmó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.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.