adatok megértése nagyszerű dolog, de a rossz adatok nagyon-nagyon rosszak lehetnek. Szerencsére, ha egy Ruby on Rails programozó van egy szép API ActiveRecord érvényesítési segítők az Ön rendelkezésére.
Ez az útmutató a gyakori és nem annyira gyakori ActiveRecord érvényesítések feltárása egy adott Ruby on Rails alkalmazásban. Használd, hogy segítsen megőrizni az adatbázisok boldog!
miért érdemes érvényesíteni?
annak biztosítása érdekében, hogy csak érvényes adatok kerüljenek az adatbázisba. Az ügyféloldali érvényesítés mellett a modellszintű érvényesítések extra biztonsági réteget biztosítanak a Ruby on Rails alkalmazás bármely űrlapmezőjéhez.
különböző szinteken adhat meg érvényesítéseket, de mindegyiknek megvan a maga erőssége és gyengesége.
- Adatbázis-kényszerek-az adatbázis-szintű egyedi korlátozások lehetővé teszik, hogy szükség esetén ne legyen ismétlődő mező vagy oszlop. Ez sokkal mélyebb lehet, mint az egyediség. azaz alapértelmezett értékek, nem nulla korlátok, tartományok stb…
- kliens oldali érvényesítés-ezek vizuálisan hasznosak és jobb felhasználói élményt nyújtanak, de gyakran megbízhatatlanabbak. Én szinte mindig egy biztonsági tervet ezzel a megközelítéssel, mint egy kellene.
- modell szint ( sínek) – amiről most beszélünk!
- Controller Level (Rails) – csábító használni, de nehezebb tesztelni és karbantartani. Ez egy konvenció/legjobb gyakorlat, hogy a vezérlőket a lehető legkönnyebben tartsa.
mikor történik a validálás?
egyenesen a ruby on rails dokumentációjából:
kétféle aktív Rekordobjektum létezik: azok, amelyek megfelelnek egy sornak az adatbázisban, és azok, amelyek nem. Amikor új objektumot hoz létre, például a
newmetódus használatával, az objektum még nem tartozik az adatbázishoz. Asavemeghívása után az objektum a megfelelő adatbázis-táblába kerül. Az Active Record anew_record?példány módszer segítségével határozza meg, hogy egy objektum már szerepel-e az adatbázisban.
egy új aktív Rekordosztály létrehozása lehetőséget ad arra, hogy egynew_record? metódust használjunk, hogy kitaláljuk ezt az egészet.
class Article < ApplicationRecordend
ennek során megnyomhatjuk arails console a folyamat pontos meghatározásához.
$ rails console>> article = Article.new(title: "My Article")=> #<Article id:nil title: "My Article", created_at: nil, updated_at: nil>>> article.new_record?=> true>> article.save=> true>> article.new_record?=> false
valójában hív saveez az, ami leköti az adatbázisba, és a színfalak mögött létrehozza a szükséges SQL utasításokat ehhez. Ennek eredményeként az érvényesítéseket általában az adatok teljes elküldése előtt futtatják az adatbázisba.
a következő módszerek validációkat idéznek elő használatkor:
createcreate!savesave!updateupdate!
a bang verziók (pl.
save!) kivételt emel, ha a rekord érvénytelen. A nem bang verziók nem:saveandupdatereturnfalse, andcreatecsak visszaadja az objektumot.
azok a módszerek, amelyek kihagyják az érvényesítéseket
az alábbiak bármelyikének használatával teljesen kihagyják az érvényesítéseket. Óvatosan használja az értékes adatokat!
decrement!decrement_counterincrement!increment_countertoggle!touchupdate_allupdate_attributeupdate_columnupdate_columnsupdate_counters
Validation helpers
What I love about Ruby on Rails is the bundled goodness you get for doing pretty hard things. Az érvényesítési segítők egyike azoknak a dolgoknak, amelyek melegnek és hangulatosnak érzik magukat, amikor egy új alkalmazást telepítenek a vadonban. Ez sok támogatást nyújt a kliens oldalról gyűjtött adatok széles skálájához.
minden segítő Elfogad egy:onés:message opciót. Ezek az opciók határozzák meg, hogy mikor kell futtatni az érvényesítést, és milyen üzenetet kell hozzáadni a errors gyűjteményhez, ha nem sikerül (ezek segítségével beadhatja a hibákat a nézetekbe, hogy a felhasználó tudja, mit kell megváltoztatni/megváltoztatni).
van egy csomó érvényesítési segítők, az alábbiakban néhány a leggyakrabban használt. Kérjük, olvassa el az aktív nyilvántartás-validációk útmutatóját további felhasználási esetekért.
megerősítés
hasznos az érvényesítéshez, ha két szövegmezőnek ugyanazt a bejegyzést kell tartalmaznia. Gondoljon például egy e-mail visszaigazolásra.
class User < ApplicationRecord validates :email, confirmation: trueend
most a nézetben két mező áll rendelkezésre:
<%= text_field :user, :email %><%= text_field :user, :email_confirmation %>
az egyik dolog, hogy ez az érvényesítés csak akkor működik, ha a presence opció igaz a modellben is.
tehát a User modell frissítést kap:
class User < ApplicationRecord validates :email, confirmation: true validates :email_confirmation, presence: true end
kizárás
Ha bármilyen szót le kell foglalnia, vagy meg kell győződnie arról, hogy egy adott bejegyzés egyedi, használja a exclusion.
class Profile < ApplicationRecord validates :username, exclusion: { in: %w(username1 username2 username3), message: "%{value} has already been taken." }end
figyeljük meg, hogyan használtam:message itt is. Ez minden érvényesítési segítőn megtalálható.
a inclusion ellenkező módon is használható. További információkért lásd a dokumentumokat!
formátum
a formázási karakterláncok néha ideálisak az alkalmazáshoz. Reguláris kifejezéseket használhat az érvényesítéseken belül, hogy megváltoztassa, amit keres.
class Plan < ApplicationRecord validates :plan_type, format: { with: /\A+\z/, message: "Plans can only inlude letters"}end
Hossz
ezt mindig használom, hogy korlátozást tegyek egy adott mező karakterhosszára.
class User < ApplicationRecord validates :name, length: { minimum: 5 } # sets a minimum validates :bio, length: { maximum: 500 } # sets a maximum validates :handle, length: { in: 5..16 } # provide a rangeend
nyugodtan személyre az üzeneteket:message itt is. Az alábbiak mindegyike elérhető az üzenet testreszabásához.
wrong_lengthtoo_long-
too_short
példa
class User < ApplicationRecord validates :bio, length: { maximum: 800, too_long: "%{count} characters is the maximum." }end
jelenlét
valószínűleg ez a legszélesebb körben használt segítő a szerszámtáskámban. A jelenlét ellenőrzi, hogy a mezők nem üresek-e.
class User < ApplicationRecord validates :name, :email, presence: trueend
az asszociáció létezését modelleken is tesztelheti
class Article < ApplicationRecord belongs_to :user validates :user, presence: true # looks for a user_id field on the articleend
az ellentétes modellen ugyanezt megteheti egy fogással, amelynek neve inverse_of
class User < ApplicationRecord has_many :articles, inverse_of: :userend
egyediség
talán egyedi felhasználóneveket szeretne az alkalmazásban? Az egyediség ebben segít.
class User < ApplicationRecord validates :username, uniqueness: true, { message: "Username already taken" }end
Ez valójában a User táblázatot keresi a meglévő rekordokhoz a uniqueness
tovább mehetsz, és korlátozhatod a uniquenessscope.
class User < ApplicationRecord validates :plan, uniqueness: { scope: :year, message: "can only update one per year"}end
feltételes érvényesítés
néha csak a megadott feltételek között kell érvényesíteni. A feltételeket a következő megközelítéssel hajthatja végre.
class Purchase < ApplicationRecord validates :card_number, presence: true, if: :paid_with_card? def paid_with_card? payment_type == "card" endend
több feltételt kell csoportosítani? Ezt megteheti
class User < ApplicationRecord with_options if: :is_admin? do |admin| admin.validates :location, length: { minimum: 10 } admin.validates :job_title, presence: true endend
egyéni módszerek
néha a segítők nem elégek, és szükség lehet valami több egyéni. Létrehozhat saját módszereket, amelyek elvégeznek néhány érvényesítést, amelyet maga dob.
class Invoice < ApplicationRecord validate :active_subscriber, on: :create def active_customer errors.add(:customer_id, "is not active") unless subscriber.active? endend
megjegyzés: itt érvényesítem ezt a módszert a :on opcióval, amely lehetővé teszi az érvényesítés inicializálásának helyét. Ebben az esetben a :createlehetőséget választottam.
a errors gyűjteménybe is be lehet kapcsolni, mivel módosítanom kell a kliens oldali kimeneteket, ha szükséges. Ebben az esetben nincs meg a:message az egyéni módszereknél. További információ a hibákról.
utolsó szavak
remélhetőleg az érvényesítések megnyitottak néhány ötletet az alkalmazás korlátozottabbá tételéhez (jó értelemben). A Ruby on Rails és annak minden aspektusa lehetővé teszi a biztonságos adatok belépését az Ön által választott adatbázisba. A CSRF tokenektől az adatbázis – szintű érvényesítésekig, végtelen módon javíthatja az alkalmazást, nyugodt maradhat a beérkező adatokkal kapcsolatban.
szégyentelen dugó!
Ha tetszett ez a bejegyzés, több videóm van a YouTube-on és itt a blogomban. Szeretne több ilyen tartalmat a postaládájába? Iratkozzon fel hírlevelünkre, és automatikusan megkapja.
nézd meg a kurzusomat

az alapoktól kezdve szeretné megtanulni a Ruby on Rails-t? Nézze meg a közelgő, Hello Rails nevű tanfolyamomat.