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
new
metódus használatával, az objektum még nem tartozik az adatbázishoz. Asave
meghí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 save
ez 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:
create
create!
save
save!
update
update!
a bang verziók (pl.
save!
) kivételt emel, ha a rekord érvénytelen. A nem bang verziók nem:save
andupdate
returnfalse
, andcreate
csak 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_counter
increment!
increment_counter
toggle!
touch
update_all
update_attribute
update_column
update_columns
update_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_length
too_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 uniqueness
scope
.
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 :create
lehető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.