Po asi dvou týdnech mám pocit, že můžu napsat něco málo o Ruby on Rails, takovou ochutnávku pro otrávené a znuděné PHP programátory. Prozatím třeba jak se mi okamžitě zalíbil způsob řešení kontroly vstupních dat. Velice jednoduchá věc, nad kterou není potřeba moc přemýšlet, ale která se může rychle stát noční můrou, pokud jí použitý jazyk (nebo framework) podporuje špatně.

Kontrola vstupních dat ve zkratce

neboli nekončící souboj programátora a vynalézavého uživatele. Neznám nikoho, koho by psaní kontroly formulářových polí bavilo – já ten formulář vyplnit umím, tak proč se to sakra nedokáží naučit i uživatelé? Bohužel potom si uvědomíte známou rovnici (uživatel = člověk, který si plete adresní řádek s vyhledáváním v Seznamu) a se skřípotem zubů se do něčeho pustíte.

PHP

V obyčejném PHP je to opruz – PHP je sice primárně jazyk pro programování webových aplikací, ale postrádá i tuhle základní funkčnost. Možná máte nějakou oblíbenou knihovnu, nebo jste napsali nějakou vlastní, nebo třeba nevalidujete (taky možnost, alespoň si potom přečtete zajímavé maily kdo to je ten „NOT NULL“). I pokud ale uděláte validaci jednoho formuláře, tak pořád je tu problém, že do tabulky se může přistupovat z více formulářů a potom celkový_opruz = opruz_na_jeden_formulář * počet_formulářů. Teď to samozřejmě nějak pomocí Copy-Paste přenesete kam je potřeba, ale co až bude potřeba něco přidat nebo upravit? A nebo (ale to už bych opravdu nikomu nepřál) budete podobnou aplikaci upravovat po někom jiném. Neboli tohle prostě není ten správný způsob.

Ruby on Rails

V Railsech je to vyřešené mnohem efektivněji – validace se provádí v modelu (už jsem se zmínil, že Rails jsou MVC framework?) a zároveň je k dispozici dost užitečných funkcí, které jí usnadňují. Stejně tak není problém napsat si další nebo se podívat jestli někdo nebyl rychlejší.
Typický kód pro validaci vypadá například takhle:

class User < ActiveRecord::Base
validates_uniqueness_of :user, :scope => „domain_id“, :message => ‘Uživatel již existuje’
validates_format_of :user, :with => /^([0-9a-zA-Z-.])+$/, :message => ‘Neplatný název uživatele’
validates_confirmation_of :password, :message => „Zadaná hesla se neshodují“
end

První validátor je ověřuje unikátnost hodnoty ve sloupci (prakticky UNIQUE index). Parametr scope určuje, že se budou brát jenom hodnoty se stejným domain_id (tzn. musí být unikátní kombinace hodnot ve sloupcích user a domain_id). Druhý validátor je klasický regulární výraz. A poslední je pro ověření, jestli je nějaké pole správně potvrzeno, typicky heslo.
Message je ve všech případech chybová hláška. Kvůli počeštění aplikace jsem musel použít upravenou verzi helperu (pomocné funkce) error_message_for, která má na starost zobrazení samotné chybové hlášky. Pokud byste programovali aplikaci pouze pro angličtinu, tak máte všechno ještě o něco jednodušší.

A výsledek vypadá třeba takhle (zde jsou ještě navíc použity validátory validates_presence_of):

Docela hezké na tři řádky kódu ne? Takže pokud bych měl vzít výhody, které mi Ruby on Rails přinesly co se týče validace formulářů:

  • Všechno je uložené na jednom místě v modelu
  • Mám spoustu funkcí, které udělají většinu práce za mě
  • Kód je krátký, srozumitelný a rychle napsaný
Odpovědi k “Úvod do Ruby on Rails, aneb dokážete tohle s PHP I.”
  1. Pizi napsal:

    Píšu tutorial na téma Ruby on Rails na http://rails.jinak.cz a jelikož mi chybí zpětná vazba snažím se tímhle příspěvkem nalákat nějaké čtenáře i k sobě.

  2. admin napsal:

    [1]

    Myslím, že tutorial je dobrý, začal bych ale úpravou stránek, aby vypadaly normálně :-) Dost lidí totiž rychle uteče, což je škoda, tutorial mi přijde dobře napsaný.

    Některé věci tam sice nejsou přesné (id není povinný sloupec, dá se přenastavit), začátečníkům, tzn. i mě bych ho určitě doporučil.

  3. Pizi napsal:

    Snad už je to lepší.

  4.  
Zanechej komentář

K zanechání komentáře ke článku musíte být přihlášen. Přihlásit »