Railsin mukautettujen validointien ymmärtäminen
Harkitaanpa vaatimusta ja ymmärretään sitten kunkin tai minkä tahansa näistä tarve:
Harkitaan, että meillä on Item-malli, jonka taulun nimi on items
, jossa jokainen tietue edustaa pakettia, jonka attribuutit ovat title
, description
,width
, height
, depth
ja weight.
Jokainen Item on noudatettava seuraavia sääntöjä:
- Haluamme, että otsikon tulee olla minimissään pituudeltaan vähintään 10 merkkiä ja jokaisen otsikon on sisällettävä avainsana i.esim.
great-article
. - Kohteen tilavuuden on oltava 20 ja 3000 kuutiometrin välillä (ts. Tilavuusvalidointi)
- Kappaleen tiiviys ei saa ylittää 200 grammaa kuutiometriä kohden (ts.
Compactness Validation
) - Sivun pituus ei saa olla alle 15 % suurimmasta sivusta (ts. Suhteellisuusvalidointi).
Poimitaan nyt ensimmäinen sääntö ensimmäisellä lähestymistavalla
- Käytä mukautettua metodia validoinnin suorittamiseen.
Olemme käyttäneet aivan ensimmäistä lähestymistapaa mukautettuun validointiin, eli määrittelemme validate-metodin malliluokan sisälle.
Tämähän toimii hienosti, mutta lisää myös lisää logiikkaa malliin. Sen on parempi purkaa logiikka erilliseen apuluokkaan aina kun se on mahdollista. Tämä johtuu siitä, että kaikki tietyn validoinnin logiikka on kapseloitu omaan objektiinsa, jolloin se on helppo debugata.
Varmennetaan tiheys käyttämällä toista lähestymistapaa eli luomalla apuluokka validator. Railsin tarjoama #validates_with
metodi osoittaa validoinnin auttajaluokkaan:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Luo nyt auttajaluokka CompactnessValidator
Luo hakemistoon /models/concerns ”compactness_validator.rb”. CompactnessValidator
periytyy ActiveModel::Validator
:sta, jonka omaisuus on, että siellä on metodi nimeltä #validate
. Tämä metodi voi käyttää koko tietuetta. Ja voi tarvittaessa soveltaa virheitä tietueeseen.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Huomaa, tässä voimme lisätä n-määrän validointeja tässä samassa luokassa eri attribuuteille. esim. voimme jopa lisätä validoinnin otsikolle tässä luokassa.
esimerkiksi.
Käytetään nyt kolmatta lähestymistapaa mukautettujen validointien määrittelyyn.
Luoessamme mukautetun validointi-apulaisen, voimme käyttää sitä suoraan aivan kuten railsin sisäänrakennettuja, vain sanomalla, ”item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Nyt kun olemme asettaneet item_dimensions_proportion lipun arvoksi true, rails odottaa nyt, että meillä on validointia varten apulaisluokka nimeltä ItemDimensionsProportionValidator. Luodaan siis malleja koskevaan hakemistoon tiedosto ”item_dimensions_proportion_validator.rb”.
Meidän on määriteltävä #validates_each
metodi validoinnin helpottamiseksi. Se ottaa jokaisen attribuutin ja tarkistaa arvon validate_each-metodiin kirjoitetun logiikan mukaisesti.
Kustomoitujen validaattoreiden käyttäminen on hienoa, jos haluat purkaa validointiin liittyvän koodin erilliseen luokkaan. Se on todella hyödyllistä myös debuggauksen kannalta, koska kaikki mallin validointikoodi on yhdessä paikassa. Lisäksi voimme jopa käyttää samoja validaattoreita useisiin luokkiin, mikä tekee siitä todella kätevän ja mahtavan.
Kokeile näitä mukautettuja validaattoreita sovelluksissasi ja kerro minulle, jos tämä on auttanut sinua positiivisella tavalla. Voit myös ottaa yhteyttä minuun, jos sinulla on ongelmia @ [email protected].
Haluaisin myös lisätä lukijakuntaani, joten pyydän sinua ystävällisesti jakamaan sen ystävillesi, kollegoillesi jne., jos pidät tätä blogia hyödyllisenä.
Kiitos.
Kiitos.