Zrozumienie niestandardowych walidacji Rails
Rozważmy wymaganie, a następnie zrozumiemy potrzebę każdego, lub któregokolwiek z nich:
Zastanówmy się, że mamy model Item, z nazwą tabeli jako items
, gdzie każdy rekord reprezentuje pakiet z atrybutami jako title
, description
,width
, height
, depth
, i weight.
Każda pozycja musi przestrzegać następujących reguł:
- Chcemy, aby tytuł miał minimalną długość 10 znaków, a każdy tytuł powinien zawierać słowo kluczowe i.e.
great-article
. - Objętość elementu musi być pomiędzy 20 a 3000 metrów sześciennych (tj. Walidacja objętości)
- Zwięzłość elementu nie może przekraczać 200 gramów na metr sześcienny (tj.
Compactness Validation
) - Długość boku nie może być mniejsza niż 15% największego boku (tj. walidacja proporcji).
Podnieśmy teraz pierwszą zasadę, z pierwszym podejściem
- Użyj niestandardowej metody do wykonania walidacji.
Użyliśmy pierwszego podejścia do niestandardowej walidacji, tj. zdefiniowaliśmy metodę validate wewnątrz klasy modelu.
To działa dobrze, ale dodaje więcej logiki do modelu. Preferowane jest wyodrębnienie logiki w oddzielnej klasie pomocniczej, gdy tylko jest to możliwe. To dlatego, że cała logika dla konkretnej walidacji jest zamknięta w swoim własnym obiekcie, co czyni ją łatwą do debugowania.
Walidujmy gęstość używając drugiego podejścia, tj. tworząc klasę helpera walidatora. The #validates_with
method provided by rails points the validation to a helper class:
class Item < ActiveRecord::Base
…
validates_with CompactnessValidator
…
end
Teraz musimy stworzyć klasę pomocniczą CompactnessValidator
W katalogu /models/concerns, utwórz „compactness_validator.rb”. Klasa CompactnessValidator
dziedziczy po klasie ActiveModel::Validator
, której właściwością jest istnienie metody o nazwie #validate
. Ta metoda może uzyskać dostęp do całego rekordu. I może zastosować błędy do rekordu jeśli zajdzie taka potrzeba.
class CompactnessValidator << ActiveModel::Validator
def validate(record)
if record.compactness > 10
record.errors.add(:compactness, "is too high to safely dispatch")
end
end
end
Uwaga, tutaj możemy dodać n-numer walidacji w tej samej klasie dla różnych atrybutów. np. możemy nawet dodać walidację dla tytułu w tej klasie.
for eg.
Now lets use the third approach of defining custom validations.
Tworząc niestandardowy helper walidatora, możemy go bezpośrednio używać tak jak wbudowane w rails, po prostu mówiąc, „item_dimensions_proportion:true”.
class Item < ActiveRecord::Base
...
validates :height, :width, :depth, item_dimensions_proportion: true
...
end
Teraz jak ustawiliśmy flagę item_dimensions_proportion na true, rails będzie teraz oczekiwał klasy helpera dla walidacji o nazwie ItemDimensionsProportionValidator. Zatem w katalogu models concern utwórz plik „item_dimensions_proportion_validator.rb”.
Musimy zdefiniować metodę #validates_each
ułatwiającą walidację. Będzie ona pobierała każdy atrybut i sprawdzała wartość zgodnie z logiką zapisaną w metodzie validate_each.
Używanie niestandardowych walidatorów jest świetne, jeśli chcesz wyodrębnić walidację związaną z kodem do osobnej klasy. Jest to również bardzo pomocne w debugowaniu, ponieważ cały kod walidacji dla modelu leży w jednym miejscu. Możemy również używać tych samych walidatorów dla wielu klas, co czyni go naprawdę poręcznym i niesamowitym.
Wypróbuj te niestandardowe walidatory w swoich aplikacjach i daj mi znać, czy pomogło ci to w pozytywny sposób. Możesz również skontaktować się ze mną w przypadku jakichkolwiek problemów @ [email protected].
Chciałbym również zwiększyć liczbę moich czytelników, więc uprzejmie proszę o podzielenie się tym z przyjaciółmi, rówieśnikami, etc, jeśli uważasz, że ten blog jest pomocny.
Dziękuję.