Înțelegerea validărilor personalizate Rails
Să luăm în considerare o cerință și apoi să înțelegem necesitatea fiecăruia sau a oricăruia dintre acestea:
Să considerăm că avem un model Item, cu numele tabelului items
, unde fiecare înregistrare reprezintă un pachet cu atributele title
, description
,width
, height
, depth
, și weight.
Care articol trebuie să respecte următoarele reguli:
- Vrem ca titlul să aibă o lungime minimă de 10 caractere, iar fiecare titlu să conțină un cuvânt cheie i.e.
great-article
. - Volumul articolului trebuie să fie cuprins între 20 și 3000 de metri cubi (de ex. Validarea volumului)
- Compactitatea articolului nu poate depăși 200 de grame pe metru cub (de ex.
Compactness Validation
) - Nici o latură nu poate fi mai mică de 15% din cea mai mare latură (de ex. validarea proporției).
Acum să reluăm prima regulă, cu prima abordare
- Utilizați o metodă personalizată pentru a efectua validarea.
Am folosit chiar prima abordare pentru validarea personalizată, adică să definim o metodă validate în interiorul clasei model.
Funcționează bine, dar adaugă și mai multă logică la model. Este preferabil să extragem logica într-o clasă ajutătoare separată ori de câte ori este posibil. Acest lucru se datorează faptului că toată logica pentru o anumită validare este încapsulată în propriul obiect, ceea ce face mai ușor de depanat.
Să validăm densitatea folosind a doua abordare, adică prin crearea unei clase helper validator. Metoda #validates_with
metoda furnizată de rails direcționează validarea către o clasă ajutătoare:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Acum trebuie să creăm o clasă ajutătoare CompactnessValidator
În directorul /models/concerns, creați „compactness_validator.rb”. Clasa CompactnessValidator
moștenește din ActiveModel::Validator
, a cărei proprietate este să existe o metodă numită #validate
. Această metodă poate accesa întreaga înregistrare. Și poate aplica erori înregistrării, dacă este necesar.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Rețineți, aici putem adăuga un număr n de validări în aceeași clasă pentru diferite atribute. de exemplu, putem adăuga chiar și validarea pentru titlu în această clasă.
de exemplu.
Acum să folosim a treia abordare de definire a validărilor personalizate.
Creând un helper validator personalizat, îl putem folosi direct la fel ca și cele încorporate de rails, doar spunând „item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Acum, deoarece am setat steagul item_dimensions_proportion la true, rails se va aștepta acum să aibă o clasă helper pentru validare numită ItemDimensionsProportionValidator. Deci, în directorul de preocupări al modelelor, creați un fișier „item_dimensions_proportion_validator.rb”.
Trebuie să definim o metodă #validates_each
pentru a facilita validarea. Aceasta va lua fiecare atribut și va verifica valoarea în conformitate cu logica scrisă în metoda validate_each.
Utilizarea validatorilor personalizați este un lucru excelent, dacă doriți să extrageți validarea legată de cod într-o clasă separată. Este foarte util și pentru depanare, deoarece tot codul de validare pentru un model se află într-un singur loc. De asemenea, putem chiar să folosim aceleași validatoare pentru mai multe clase, ceea ce îl face cu adevărat la îndemână și minunat.
Încercați aceste validatoare personalizate în aplicațiile dvs. și anunțați-mă dacă v-a ajutat într-un mod pozitiv. De asemenea, puteți să mă contactați în cazul oricărei probleme @ [email protected].
Am dori, de asemenea, să măresc numărul de cititori, așa că vă rog să îl distribuiți cu prietenii, colegii, etc., dacă găsiți acest blog util.
Mulțumesc.
.