Data je skvělá věc, ale špatné údaje mohou být velmi, velmi špatné. Naštěstí, pokud jste programátor Ruby on Rails, máte k dispozici pěkné API pomocníků pro ověření ActiveRecord.
tato příručka je zkoumáním běžných a ne tak běžných validací ActiveRecord v dané aplikaci Ruby on Rails. Použijte jej k tomu, aby vaše databáze byly šťastné!
Proč používat validace?
Chcete-li zajistit, aby byla do vaší databáze uložena pouze platná data. Na vrcholu clientside validace modelu-úroveň ověření poskytuje další vrstvu zabezpečení pro všechny a všechny pole formuláře v Ruby on Rails aplikace.
můžete poskytnout validace v různých úrovních, ale všechny mají své silné a slabé stránky.
- omezení databáze-unikátní omezení na úrovni databáze umožňuje žádné duplicitní pole nebo sloupce, pokud požadujete. To může jít mnohem hlouběji než jen jedinečnost. tj. výchozí hodnoty, nenulová omezení, rozsahy atd…
- ověření na straně klienta-jsou užitečné vizuálně a poskytují lepší uživatelský dojem, ale často jsou nespolehlivější. Téměř vždy bych poskytl plán zálohování pomocí tohoto přístupu, jak by měl.
- Model Level (Rails) – o čem teď mluvíme!
- úroveň regulátoru (kolejnice) – lákavé použití, ale obtížnější testování a údržba. Je to konvence / nejlepší praxe, aby vaše ovladače byly co nejlehčí.
kdy skutečně dochází k ověření?
Přímo z dokumentace ruby on rails:
existují dva druhy aktivních objektů záznamu: ty, které odpovídají řádku uvnitř vaší databáze, a ty,které ne. Když vytvoříte nový objekt, například pomocí metody
new
, tento objekt ještě nepatří do databáze. Jakmile zavolátesave
na tento objekt bude uložen do příslušné databázové tabulky. Aktivní záznam používá metodu instancenew_record?
k určení, zda je objekt již v databázi nebo ne.
Vytvoření nové Aktivní Záznamy třída nám poskytuje příležitost používat new_record?
metoda se na to přijít.
class Article < ApplicationRecordend
při tom můžeme stisknout rails console
pro určení procesu.
$ 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
volat save
je to, co odevzdá ho do databáze a v zákulisí vytváří potřebné SQL
prohlášení, aby tak učinily. V důsledku toho jsou validace obvykle spuštěny před úplným odesláním dat do databáze.
následující metody envoke validace na použití:
create
create!
save
save!
update
update!
bang verze (např.
save!
) vyvolat výjimku, pokud záznam je neplatný. Verze bez třesku ne:save
update
zpětfalse
create
vrací objekt.
metody, které přeskočí validace
pomocí kterékoli z následujících možností přeskočí validace úplně. Používejte s opatrností cenné údaje!
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. Validační pomocníci jsou jednou z těch věcí, díky nimž se při zavádění nové aplikace ve volné přírodě cítím v teple a útulně. To poskytuje velkou podporu pro širokou škálu dat, které můžete sbírat ze strany klienta.
každý pomocník přijímá volbu :on
a :message
. Tyto možnosti určují, při validaci by měl být spuštěn a jaké zprávy by měly být přidány do errors
kolekci, pokud to selže (můžete použít tyto pomůže aplikovat to, co se děje uvnitř vaše názory, takže uživatel ví, co změnit/upravit).
existuje spousta pomocníků pro ověření, níže jsou některé z mých nejpoužívanějších. Další případy použití naleznete v příručce o aktivních validacích záznamů.
potvrzení
užitečné pro ověření, když dvě textová pole musí mít stejnou položku. Přemýšlejte například o e-mailovém potvrzení.
class User < ApplicationRecord validates :email, confirmation: trueend
Nyní, podle vašeho názoru můžete mít dvě pole:
<%= text_field :user, :email %><%= text_field :user, :email_confirmation %>
Jeden gotcha je, že toto ověření se provádí pouze v případě, presence
možnost nastavena na true v modelu stejně.
User
model dostane aktualizaci:
class User < ApplicationRecord validates :email, confirmation: true validates :email_confirmation, presence: true end
Vyloučení
Pokud potřebujete vyhradit jakékoliv slovo a ujistěte se, že daná položka je jedinečný používání exclusion
.
class Profile < ApplicationRecord validates :username, exclusion: { in: %w(username1 username2 username3), message: "%{value} has already been taken." }end
Všimněte si, jak jsem použil :message
také zde. Toto je poskytováno u všech pomocníků pro ověření.
můžete také použít inclusion
opačným způsobem. Podívejte se na dokumenty pro více informací!
Formát
formátovací řetězce jsou někdy ideální pro vaši aplikaci. Můžete použít regulární výrazy v rámci validací změnit, co jste po.
class Plan < ApplicationRecord validates :plan_type, format: { with: /\A+\z/, message: "Plans can only inlude letters"}end
Délka
používám tento po celou dobu k omezení délky znaku daného pole.
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
neváhejte a přizpůsobte si zprávy pomocí :message
také zde. Následující jsou k dispozici pro připojení k přizpůsobení zprávy.
wrong_length
too_long
-
too_short
Příklad:
class User < ApplicationRecord validates :bio, length: { maximum: 800, too_long: "%{count} characters is the maximum." }end
Přítomnost
Toto je pravděpodobně nejpoužívanější pomocník v nářadí. Přítomnost kontroluje, zda Pole nejsou prázdná.
class User < ApplicationRecord validates :name, :email, presence: trueend
můžete také vyzkoušet sdružení existuje na modely
class Article < ApplicationRecord belongs_to :user validates :user, presence: true # looks for a user_id field on the articleend
Na nepřátelský model, můžete udělat totéž s jedním chytit nazývá inverse_of
class User < ApplicationRecord has_many :articles, inverse_of: :userend
Jedinečnost
Možná budete chtít unikátní uživatelská jména na vaše aplikace? Jedinečnost s tím pomáhá.
class User < ApplicationRecord validates :username, uniqueness: true, { message: "Username already taken" }end
To vlastně hledání User
tabulka pro stávající záznamy k určení uniqueness
můžete jít ještě dále a omezit uniqueness
scope
.
class User < ApplicationRecord validates :plan, uniqueness: { scope: :year, message: "can only update one per year"}end
podmíněné validace
někdy stačí ověřit pouze v rámci daných podmínek. Podmínění můžete provádět pomocí následujícího přístupu.
class Purchase < ApplicationRecord validates :card_number, presence: true, if: :paid_with_card? def paid_with_card? payment_type == "card" endend
potřebujete seskupit více podmínek? Můžete to udělat
class User < ApplicationRecord with_options if: :is_admin? do |admin| admin.validates :location, length: { minimum: 10 } admin.validates :job_title, presence: true endend
Vlastní Metody
Někdy pomocníci nestačí a budete možná potřebovat něco více vlastní. Můžete si vytvořit vlastní metody, které některé validace valíte sami.
class Invoice < ApplicationRecord validate :active_subscriber, on: :create def active_customer errors.add(:customer_id, "is not active") unless subscriber.active? endend
poznámka zde ověřuji tuto metodu pomocí volby :on
, která vám umožní určit, kde inicializovat ověření. V tomto případě jsem zvolil :create
.
můžete také připojit do errors
kolekce, protože musím změnit, jaké výstupy na straně klienta, pokud potřebujete. V tomto případě nemáme :message
na vlastních metodách. Přečtěte si více o chybách.
závěrečná slova
doufejme, že validace otevřely některé nápady pro vás, aby vaše aplikace více omezené (v dobrém slova smyslu). Použití Ruby on Rails a všech jeho aspektů umožňuje bezpečná data pro vstup do libovolné databáze podle vašeho výběru. Od tokenů CSRF po ověření na úrovni databáze, existují nekonečné způsoby, jak vylepšit vaši aplikaci, může zůstat v klidu ohledně přicházejících dat.
nestydatá zástrčka!
Pokud se vám tento příspěvek líbil, mám více videí na YouTube a zde na svém blogu. Chcete ve své doručené poště více podobného obsahu? Přihlaste se k odběru mého zpravodaje a získejte jej automaticky.
Podívejte se na můj kurz
☝ se Chtějí naučit Ruby on Rails od základů? Podívejte se na můj nadcházející kurz s názvem Hello Rails.