Pochopení vlastních validací Rails
Uvažujme o požadavku a pak pochopíme potřebu každé z nich nebo některé z nich:
Uvažujme, že máme model položky s názvem tabulky jako items
, kde každý záznam představuje balíček s atributy jako title
, description
,width
, height
, depth
a weight.
Každá položka musí splňovat následující pravidla:
- Chceme, aby název měl minimální délku 10 znaků a aby každý název obsahoval klíčové slovo i.Např.
great-article
. - Objem položky musí být v rozmezí od 20 do 3000 metrů krychlových (tj. Validace objemu)
- Kompaktnost předmětu nesmí překročit 200 gramů na metr krychlový (tj.
Compactness Validation
) - Délka žádné strany nesmí být menší než 15 % největší strany (tj. validace podílu).
Nyní navážeme na první pravidlo, s prvním přístupem
- Použijeme vlastní metodu pro provedení validace.
Použili jsme úplně první přístup k vlastní validaci, tj. definujeme metodu validate uvnitř třídy modelu.
Funguje to dobře, ale také to přidává do modelu další logiku. Je vhodnější vyčlenit logiku do samostatné pomocné třídy, kdykoli je to možné. To proto, že veškerá logika pro konkrétní validaci je zapouzdřena do vlastního objektu, což usnadňuje její ladění.
Validujme hustotu pomocí druhého přístupu, tj. vytvořením pomocné třídy validátor. Metoda #validates_with
poskytovaná systémem rails odkazuje validaci na pomocnou třídu:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Nyní musíme vytvořit pomocnou třídu CompactnessValidator
V adresáři /models/concerns vytvořte „compactness_validator.rb“. Třída CompactnessValidator
dědí od třídy ActiveModel::Validator
, jejíž proprietou je, aby tam byla metoda s názvem #validate
. Tato metoda může přistupovat k celému záznamu. A v případě potřeby může na záznam aplikovat chyby.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Všimněte si, že zde můžeme v téže třídě přidat n-počet validací pro různé atributy. např. můžeme v této třídě přidat i validaci pro název.
např.
Nyní použijeme třetí přístup definování vlastních validací.
Vytvořením vlastního pomocného validátoru jej můžeme přímo použít stejně jako vestavěné validátory rails, a to pouhým příkazem „item_dimensions_proportion:true“.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Jelikož jsme nyní nastavili příznak item_dimensions_proportion na true, bude nyní rails očekávat, že bude mít pomocnou třídu pro validaci s názvem ItemDimensionsProportionValidator. V adresáři models concern tedy vytvořte soubor „item_dimensions_proportion_validator.rb“.
Musíme definovat #validates_each
metodu pro usnadnění validace. Ta vezme každý atribut a zkontroluje hodnotu podle logiky zapsané v metodě validate_each.
Použití vlastních validátorů je skvělé, pokud chcete vyčlenit validaci související s kódem do samostatné třídy. Je to také velmi užitečné při ladění, protože veškerý validační kód pro model leží na jednom místě. Také můžeme dokonce použít stejné validátory pro více tříd, což je opravdu praktické a úžasné.
Vyzkoušejte tyto vlastní validátory ve svých aplikacích a dejte mi vědět, zda vám to pozitivně pomohlo. Také se na mě můžete obrátit v případě jakéhokoli problému na @ [email protected].
Rad bych také zvýšil počet svých čtenářů, takže bych vás laskavě požádal, abyste se o něj podělili se svými přáteli, kolegy atd. pokud vám tento blog pomůže.
Díky.