Comprensione delle convalide personalizzate di Rails
Consideriamo un requisito e poi capiamo la necessità di ognuno di questi:
Consideriamo di avere un modello Item, con nome della tabella come items
, dove ogni record rappresenta un pacchetto con attributi come title
, description
,width
, height
, depth
, e weight.
Ogni item deve rispettare le seguenti regole:
- Vogliamo che il titolo abbia una lunghezza minima di 10 caratteri, e ogni titolo deve contenere una parola chiave i.e.
great-article
. - Il volume dell’articolo deve essere compreso tra 20 e 3000 metri cubi (es. Validazione del volume)
- La compattezza dell’articolo non può superare i 200 grammi per metro cubo (es.
Compactness Validation
) - Nessun lato può essere inferiore al 15% del lato più grande (es. validazione della proporzione).
Ora riprendiamo la prima regola, con il primo approccio
- Utilizzare un metodo personalizzato per eseguire la validazione.
Abbiamo usato il primissimo approccio per la validazione personalizzata, cioè definire un metodo validate all’interno della classe del modello.
Funziona bene, ma aggiunge anche più logica al modello. È preferibile estrarre la logica in una classe helper separata quando possibile. Questo perché, tutta la logica per una particolare convalida è incapsulata in un proprio oggetto, rendendo più facile il debug.
Convalidiamo la densità usando il secondo approccio, cioè creando una classe helper validator. Il #validates_with
metodo fornito da rails punta la validazione su una classe helper:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Ora dobbiamo creare una classe helper CompactnessValidator
Nella directory /models/concerns, creare “compactness_validator.rb”. La CompactnessValidator
eredita da ActiveModel::Validator
, la cui proprietà è di avere un metodo chiamato #validate
. Questo metodo può accedere all’intero record. E può applicare errori al record se necessario.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Nota, qui possiamo aggiungere n-numero di convalide in questa stessa classe per vari attributi. es. possiamo anche aggiungere la convalida per il titolo in questa classe.
per es.
Ora usiamo il terzo approccio di definire convalide personalizzate.
Con la creazione di un helper validatore personalizzato, possiamo usarlo direttamente proprio come quelli integrati in rails, semplicemente dicendo “item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Ora che abbiamo impostato il flag item_dimensions_proportion a true, rails si aspetta di avere una classe helper per la validazione chiamata ItemDimensionsProportionValidator. Quindi, nella directory dei modelli, create un file “item_dimensions_proportion_validator.rb”.
Dobbiamo definire un metodo #validates_each
per facilitare la validazione. Prenderà ogni attributo, e controllerà il valore secondo la logica scritta nel metodo validate_each.
Utilizzare i validatori personalizzati è un’ottima cosa, se si vuole estrarre la validazione relativa al codice in una classe separata. È molto utile anche per il debug, dato che tutto il codice di validazione di un modello si trova in un unico posto. Inoltre possiamo anche usare gli stessi validatori per più classi, il che lo rende davvero comodo e fantastico.
Provare questi validatori personalizzati nelle vostre applicazioni, e fatemi sapere se questo vi ha aiutato in modo positivo. Inoltre potete contattarmi in caso di qualsiasi problema @ [email protected].
Vorrei anche aumentare i miei lettori, quindi vi chiedo gentilmente di condividerlo con i vostri amici, colleghi, ecc, se trovate questo blog utile.
Grazie.