A Ruby on Rails ActiveRecord Validations

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. A save meghívása után az objektum a megfelelő adatbázis-táblába kerül. Az Active Record a new_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:

  • 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 and update return false, and create 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 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

https://i.imgur.com/KIaaJEB.jpg

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.