Pochopení Ruby on Rails ActiveRecord Validace

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áte save na tento objekt bude uložen do příslušné databázové tabulky. Aktivní záznam používá metodu instance new_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: saveupdate zpět falsecreate 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 uniquenessscope.

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

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

☝ 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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.