<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Karmi is on Rails - V&#353;e</title>
  <id>tag:blog.karmi.cz,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://blog.karmi.cz/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blog.karmi.cz/" rel="alternate" type="text/html"/>
  <updated>2008-10-31T19:34:30+00:00</updated>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2008-10-31:2610</id>
    <published>2008-10-31T08:16:00+00:00</published>
    <updated>2008-10-31T19:34:30+00:00</updated>
    <category term="Ostatn&#237;"/>
    <category term="Rails"/>
    <category term="Web design"/>
    <link href="http://blog.karmi.cz/2008/10/31/od-karmi-k-restafari" rel="alternate" type="text/html"/>
    <title>Od Karmi k Restafari</title>
<summary type="html">&lt;p&gt;Pojďte se rozloučit s blogem Karmi Is On Rails a dozvědět se, co nového se stalo ve světě Ruby/Rails za uplynulý rok!&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Pojďte se rozloučit s blogem Karmi Is On Rails a dozvědět se, co nového se stalo ve světě Ruby/Rails za uplynulý rok!&lt;/p&gt;
&lt;p&gt;Dobrá předsevzetí mají nejdelší život. Tak dlouho ležely nadesetinu až načtvrt připravené články v šuplíku, až autora život poučil, že už je nikdy nedopíše.&lt;/p&gt;

&lt;p&gt;Když před rokem a půl publikoval první článek o Ruby on Rails na tomto blogu, neexistoval v Čechách (veřejný) spolehlivý Rails hosting. Jediné informace o Ruby a Rails byly bez kontextu, útržkovité nebo zastaralé. Neexistovalo fórum ani IRC kanál na výměnu zkušeností a kontaktů. Neexistovala setkání vývojářů v Ruby. Ani svobodný software v Ruby českého původu. Nikdo nepsal testy, leckdy protože nevěděl, že se nějaké testy pro webové aplikace píšou. Pro lokální vývojářskou komunitu bylo kromě několika výjimek Ruby on Rails nesrozumitelný úkaz, který je jim přece k ničemu, když „mají svoje PHP a tam to jde taky“. Až na to poslední :) se za tu dobu leccos změnilo. Proto je na místě alespoň ta nejmenší rekapitulace.&lt;/p&gt;

&lt;h2&gt;Rok a půl v Ruby a Rails&lt;/h2&gt;

&lt;p&gt;Čtyři články na tomto blogu tvoří (bohužel) stále neujucelenější informaci o Ruby on Rails v češtině. Pokud se chce někdo o Rails dozvědět, a začít s nimi, rozhodně má kde (přestože např. &lt;code&gt;routing&lt;/code&gt; v Rails je nyní o pár světelných let dále). &lt;span class=&quot;note&quot;&gt;(Začínat s knihou lákavě nazvanou &lt;a href=&quot;http://knihy.cpress.cz/knihy/pocitacova-literatura/programovani-www-stranek/zaciname-programovat-v-ruby-on-rails/&quot;&gt;„Začínáme programovat v Ruby on Rails“&lt;/a&gt; je dle oficiálního stanoviska &lt;a href=&quot;http://www.csrug.cz/&quot; title=&quot;Československé sdružení uživatelů programovacího jazyka Ruby, o.s. | CSRUG - Czechoslovakian Ruby Users Group&quot;&gt;&lt;em&gt;Československého sdružení uživatelů programovacího jazyka Ruby&lt;/em&gt;&lt;/a&gt; rozhodně nedoporučeno :)&lt;/span&gt; &lt;em&gt;Mission accomplished.&lt;/em&gt; Děkuji všem čtenářům, kteří mi napsali do komentářů nebo e-mailem!&lt;/p&gt;

&lt;p&gt;Automatizované testování aplikací, jedna z nejdůležitějších součástí Rails a zároveň téma, které Rails pomáhaly svojí atraktivitou mezi webovými vývojáři propagovat, už není tou vysmívanou věcí „na kterou nemáme čas a peníze“. Už i v české Ruby komunitě se vedou spíše debaty &lt;em&gt;kterou testovací strategii a technologii zvolit&lt;/em&gt; a nikoliv &lt;em&gt;jestli&lt;/em&gt; testovat či netestovat. &lt;a href=&quot;http://www.webexpo.cz/prednaska/vyuziti-chemie-v-procesu-testovani-webovych-aplikaci-vytvorenych-pomoci-technologii-php-a-java/&quot; title=&quot;WebExpo | Využití chemie v procesu testování webových aplikací vytvořených pomocí technologií PHP a Java&quot;&gt;Přednášky o automatizovaném testování&lt;/a&gt; jsou obecně sice stále &lt;em&gt;unheimlich&lt;/em&gt;, ale však „oni“ to i do toho &lt;em&gt;Zend Frameworku&lt;/em&gt; nakonec dodělají a zase všichni &lt;em&gt;popojedem&lt;/em&gt; :)&lt;/p&gt;

&lt;p&gt;V Čechách nyní existuje přátelská a dosti rozmanitá &lt;a href=&quot;http://forum.rubyonrails.cz/forums/1&quot; title=&quot;Obecná diskuse - Ruby on Rails Fórum&quot;&gt;komunita vývojářů v Ruby a Rails&lt;/a&gt;, která se &lt;a href=&quot;http://forum.rubyonrails.cz/posts;search?q=setkání&quot;&gt;pravidelně setkává v Praze&lt;/a&gt;, a tak kdokoliv z vás by chtěl o Rails zjistit více, může tak učinit i mimo virtuální svět internetu. Máte-li to do Prahy daleko, můžete většinu z nás pravidelně potkat na IRC kanále &lt;a href=&quot;irc://irc.gts.cz/csrug&quot;&gt;&lt;em&gt;#rubyonrails&lt;/em&gt;&lt;/a&gt; (&lt;a href=&quot;http://www.ircnet.cz/&quot;&gt;IRCnet&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Po konferenci &lt;a href=&quot;http://ostrava.rails.cz/about&quot; title=&quot;Ostrava on Rails - First Czech Ruby On Rails Conference&quot;&gt;Ostrava on Rails&lt;/a&gt; v roce 2007 proběhla v Praze následující rok mezinárodní konference o Ruby, &lt;a href=&quot;http://www.euruko2008.org/&quot; title=&quot;EURUKO 2008 &amp;mdash; European Ruby Conference, Prague, March 29th &amp;ndash; 30th&quot;&gt;EURUKO 2008&lt;/a&gt;. Ruby se vyučuje na &lt;a href=&quot;http://web.ff.cuni.cz/nm/en/uvod_do_programovani_aneb_do_nitra_stroje&quot; title=&quot;Úvod do programování aneb do nitra stroje | New Media Studies&quot;&gt;Filosofické fakultě Univerzity Karlovy&lt;/a&gt; a na &lt;a href=&quot;http://www.unicorncollege.cz/cz/prijimaci-rizeni/Pripravne-kurzy-934&quot;&gt;Unicorn College&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Čeští Ruby vývojáři se &lt;a href=&quot;http://www.google.com/search?q=czech+site:github.com&quot;&gt;zapojili i do mezinárodní komunity&lt;/a&gt; a v Čechách vzniká &lt;a href=&quot;http://github.com/botanicus/botablog/tree/master&quot; title=&quot;botanicus's botablog at master &amp;mdash; GitHub&quot;&gt;dost&lt;/a&gt; &lt;a href=&quot;http://github.com/beam/action-mailer-queue/tree/master&quot; title=&quot;beam's action-mailer-queue at master &amp;mdash; GitHub&quot;&gt;open-source&lt;/a&gt; &lt;a href=&quot;http://github.com/jana4u/cute_admin/tree/master&quot; title=&quot;jana4u's cute_admin at master &amp;mdash; GitHub&quot;&gt;software&lt;/a&gt;. Zajímá-li vás pokrok v Rails za uplynulý rok, podívejte se určitě alespoň na k &lt;a href=&quot;http://rails-i18n.org/wiki/pages/i18n-rails-guide&quot; title=&quot;Rails I18n&quot;&gt;internacionalizační/lokalizační framework (I18n)&lt;/a&gt; &amp;mdash; viz &lt;a href=&quot;http://i18n-demo.phusion.nl/?locale=cz-CZ&quot; title=&quot;Lokalizace Rails - Ukázková aplikace&quot;&gt;průvodce ve formě živé aplikace&lt;/a&gt;. Konkrétní způsob, jak integrovat Rails lokalizaci do vaší aplikace si můžete prohlédnout &lt;a href=&quot;http://github.com/karmi/rails_i18n_demo_app/tree/master&quot; title=&quot;karmi's rails_i18n_demo_app at master &amp;mdash; GitHub&quot;&gt;v ukázkové mini-aplikaci&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Rails jsou v obecném povědomí čím dál známější, i když stále jako ten „divný“ framework v tom „divném“ jazyce (který my se učit nebudem', když máme to svoje atd atd ). To ale vůbec nevadí. Síla Rails byla od začátku v něčem úplně jiném, než že jsou „tečka za webovými frameworky“. Nic takového nikdy Rails nebyly ani být nechtěly. &lt;/p&gt;

&lt;p&gt;Síla Rails od počátku byla v tom, že nekompromisně implementovaly ty &lt;em&gt;nejlepší z prakticky možných řešení&lt;/em&gt; pro webový vývoj. V počátku to bylo použití generátorů kódu a &lt;em&gt;scaffolding&lt;/em&gt;, podpora pro automatizované testy, migrace databátového schématu, implementace Model—View–Controller průzračná jako sklo, bez „XML sklapovaček“. &lt;a href=&quot;http://www.krisjordan.com/2008/09/17/david-heinemeier-hansson-go-rest-with-rails/&quot; title=&quot;David Heinemeier Hansson - Go REST with Rails | Kris Jordan&quot;&gt;Posléze&lt;/a&gt; důsledně &lt;a href=&quot;http://www.infoq.com/articles/rest-introduction&quot; title=&quot;InfoQ: A Brief Introduction to REST&quot;&gt;RESTful&lt;/a&gt; architektura. Jedna z posledních věcí je např. &lt;a href=&quot;http://ryandaigle.com/articles/2008/8/14/what-s-new-in-edge-rails-simpler-conditional-get-support-etags&quot; title=&quot;Ryan's Scraps: What's New in Edge Rails: Simpler Conditional Get Support (ETags)&quot;&gt;Rails podpora pro tzv. „conditional get“&lt;/a&gt; neboli &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_ETag&quot; title=&quot;HTTP ETag - Wikipedia, the free encyclopedia&quot;&gt;ETag&lt;/a&gt;, což je &lt;strong&gt;ultimátní&lt;/strong&gt; řešení pro cachování webových aplikací, o kterém však mimo kruhy Rails vývojářů a často i &lt;em&gt;v nich&lt;/em&gt; člověk slyší většinou jen „ETag? Co to je todle?“ Postupně však většina z těchto strategií a technologií prosakuje i do ostatních frameworků v jiných technologiích a webový vývoj se tak postupně &lt;strong&gt;skutečně vyvíjí&lt;/strong&gt; a „vývoj“ nespočívá v tom že se maličko poladí „třída pro připojení k databázi“.&lt;/p&gt;

&lt;p&gt;Právě implementace toho nejlepšího z webového vývoje podle hesla &lt;a href=&quot;http://www.youtube.com/watch?v=dkUDqrA3aDg&amp;amp;fmt=18&quot; title=&quot;YouTube - Proč používat webový framework&quot;&gt;&lt;em&gt;„představil jsem si chlápka chytřejšího než jsem já a pak jsem přemýšlel, co by udělal“&lt;/em&gt;&lt;/a&gt;, je tím, co autora tohoto blogu přimělo opustit &lt;em&gt;teplé místo&lt;/em&gt; v internetové agentuře a vydat se opět na volnou nohu jako programátor v Ruby.&lt;/p&gt;

&lt;p&gt;Od té doby celkem úspěšně „kudy chodí, tudy o Ruby mluví“ a lidi to zdá se baví. I když za to platí :) Např. autorova &lt;a href=&quot;http://www.webexpo.cz/prednaska/efektivni-vyvoj-webovych-aplikaci-v-ruby-on-rails/&quot; title=&quot;WebExpo | Efektivní vývoj webových aplikací v Ruby on Rails&quot;&gt;přednáška na konferenci WebExpo&lt;/a&gt; která proběhla před pár týdny, se setkala s velmi příjemným přijetím, a všem, které zaujala, patří jeho dík. &lt;/p&gt;

&lt;p&gt;Prezentaci z ní si můžete prohlédnout níže a ukázkovou aplikaci &lt;a href=&quot;http://github.com/karmi/webexpo_demo_app&quot; title=&quot;karmi's webexpo_demo_app at master &amp;mdash; GitHub&quot;&gt;stáhnout&lt;/a&gt; na serveru &lt;a href=&quot;http://github.com/&quot;&gt;Github&lt;/a&gt;. &lt;span class=&quot;note&quot;&gt;(Zvažujete-li, co vám může přinést Ruby on Rails ve vaší společnosti nebo ve vašem podnikání, můžete si u autora blogu objednat &lt;a href=&quot;http://www.karmi.cz/#ruby-on-rails-workshops&quot;&gt;školení Ruby on Rails&lt;/a&gt; -- jak obecný úvod do Rails, tak specializovaná témata nebo pokročilá školení na míru.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;lt;!-- Slideshare --&gt;&lt;/p&gt;

&lt;div&gt;&amp;lt;object height=&quot;480&quot; width=&quot;575&quot; style=&quot;margin:0px&quot;&gt;&amp;lt;param name=&quot;movie&quot; value=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=webexporubyonrailskarelminarik-1224491145557778-9&amp;amp;stripped_title=efektivni-vyvoj-webovych-aplikaci-v-ruby-on-rails-webexpo-presentation&quot; /&gt;&amp;lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&amp;lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&amp;lt;embed allowfullscreen=&quot;true&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=webexporubyonrailskarelminarik-1224491145557778-9&amp;amp;stripped_title=efektivni-vyvoj-webovych-aplikaci-v-ruby-on-rails-webexpo-presentation&quot; allowscriptaccess=&quot;always&quot; height=&quot;480&quot; width=&quot;575&quot;&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/br&gt;&lt;/p&gt;

&lt;h2&gt;To nejdůležitější: Hosting!&lt;/h2&gt;

&lt;p&gt;A nakonec to nejdůležitější. Z webové aplikace, která běží na &lt;code&gt;http://localhost:3000&lt;/code&gt; má člověk možná docela radost, ale moc se o ni nepodělí. Díky relativně &lt;a href=&quot;http://www.slideshare.net/karmi/efektivni-vyvoj-webovych-aplikaci-v-ruby-on-rails-webexpo-presentation/77&quot;&gt;složité struktuře&lt;/a&gt; toho, jak Rails aplikace běží na serveru na světě prakticky neexistuje Rails hosting „na zkoušku“ nebo „zadarmo“. Vynikající prostředí pro vývoj a zkoušení Rails, navíc cele v prostředí webového prohlížeče, poskytuje např. platforma &lt;a href=&quot;http://heroku.com/&quot; title=&quot;Heroku&quot;&gt;Heroku&lt;/a&gt;. Ale nejedná se o plnohodnotný hosting.&lt;/p&gt;

&lt;p&gt;V České republice existuje samozřejmě mnoho hostingů „podporujících“ Ruby, jen málokde ale sami provozovatelé těchto hostingů vědí, co si na své weby o „podpoře Ruby“ vlastně píšou. (Nebudeme citovat.) Před několika týdny ale společnost Kraxnet, provozovatel absolutně nejlepšího Rails hostingu v České republice, &lt;a href=&quot;http://www.railshosting.cz&quot; title=&quot;Railshosting.cz &amp;mdash; Hosting pro aplikace v Ruby on Rails&quot;&gt;&lt;strong&gt;Railshosting.cz&lt;/strong&gt;&lt;/a&gt;, spustila tzv. &lt;em&gt;mod_rails&lt;/em&gt; verzi Rails hostingu, která je &lt;a href=&quot;http://wiki.xnet.cz/pages/Jak_objednat_free_Ruby_on_Rails_hosting&quot; title=&quot;XNet Wiki : Encyklopedie návodů, postupů a informací pro často řešené problémy [XNet Wiki]&quot;&gt;&lt;strong&gt;zcela zdarma&lt;/strong&gt;&lt;/a&gt;. Úplně. Naprosto. Nyní můžete díky týmu Jiřího Kubíčka hostovat v Rails &lt;strong&gt;cokoliv chcete&lt;/strong&gt;. I ty poslední, ufňukané výmluvy, proč si to nezkusit, zkrátka zmizely. &lt;span class=&quot;note&quot;&gt;Cítil-li by se snad někdo poškozen tvrzením o „nejlepším Rails hostingu”, nechť směle argumentuje v komentářích! :)&lt;/span&gt;&lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;
&lt;strong&gt;Railshosting zdarma si můžete registrovat na adrese &lt;a href=&quot;http://free.railshosting.cz&quot;&gt;http://free.railshosting.cz&lt;/a&gt;.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;Tento hosting je &lt;strong&gt;na rozdíl&lt;/strong&gt; od komerčního Rails hostingu, který je provozován na technologii „Mongrel proxyovaný Apachem“ (viz &lt;a href=&quot;http://www.slideshare.net/karmi/efektivni-vyvoj-webovych-aplikaci-v-ruby-on-rails-webexpo-presentation/77&quot;&gt;složitý obrázek&lt;/a&gt;), provozován na technologii &lt;em&gt;&lt;a href=&quot;http://www.modrails.com&quot; title=&quot;Overview &amp;#x2014; Phusion Passenger&amp;trade; (a.k.a. mod_rails / mod_rack)&quot;&gt;Phusion Passenger&lt;/a&gt;&lt;/em&gt;, neboli &lt;em&gt;&lt;a href=&quot;http://www.modrails.com&quot; title=&quot;Overview &amp;#x2014; Phusion Passenger&amp;trade; (a.k.a. mod_rails / mod_rack)&quot;&gt;mod&lt;em&gt;rails&lt;/a&gt;&lt;/em&gt;. &lt;em&gt;Phusion Passenger&lt;/em&gt; je modul do webového serveru Apache (ano!, jako &lt;em&gt;mod&lt;/em&gt;php&lt;/em&gt;! OMG PONIES!) a umožňuje současné spuštění desítek Rails aplikací, aniž by si každá z nich ukousla třicet, padesát nebo sto megabajtů paměti. Pro provoz free hostingu je zatím dle sdělení Jiřího Kubíčka vyhrazen jeden stroj IBM Blade Server (2×Xeon 3.0Ghz, 4GB RAM). Více informací, zkušeností z provozu, tipů, apod. se dočtete na &lt;a href=&quot;http://blog.xnet.cz/&quot; title=&quot;[XNETí blog]&quot;&gt;blogu společnosti Kraxnet&lt;/a&gt;. &lt;span class=&quot;note&quot;&gt;Zbývá připomenout, že se jedná o plnohodnotný, „normální“ hosting zdarma, který není „na hraní“, jak se člověk může &lt;a href=&quot;http://www.jakpsatweb.cz/katalog/hosting-ror.html&quot; title=&quot;Hosting s Ruby on Rails&quot;&gt;dočíst na internetu&lt;/a&gt;. Ne, TLD doménu nebo e-mail „na hraní“ k němu ale (překvapení! překvapení!) nedostanete.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;To &lt;strong&gt;nejdůležitější&lt;/strong&gt; je ale stále ještě v něčem jiném. &lt;/p&gt;

&lt;p&gt;Za prvé, &lt;em&gt;mod_rails&lt;/em&gt; umožňuje provozovat nejen aplikace napsané v Ruby on Rails, ale v libovolném Ruby frameworku: např. &lt;a href=&quot;http://merbivore.com/&quot; title=&quot;Merb | Looking for a hacker's framework?&quot;&gt;Merb&lt;/a&gt; nebo &lt;a href=&quot;http://github.com/bmizerany/sinatra/tree/master&quot; title=&quot;bmizerany's sinatra at master &amp;mdash; GitHub&quot;&gt;Sinatra&lt;/a&gt;. Ba co víc! Umožňuje také provoz aplikací napsaných v jazyce Python, jako je např. &lt;a href=&quot;http://www.djangoproject.com/&quot; title=&quot;Django | The Web framework for perfectionists with deadlines&quot;&gt;Django&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Za druhé: tento hosting obsahuje plnou podporu pro ty nejefektivnější techniky &lt;em&gt;deploymentu&lt;/em&gt; (instalace a aktualizace) aplikací na server pomocí nástroje &lt;a href=&quot;http://capify.org&quot;&gt;&lt;em&gt;Capistrano&lt;/em&gt;&lt;/a&gt;. &lt;em&gt;Capistrano&lt;/em&gt; vám umožňuje &lt;strong&gt;jedním příkazem&lt;/strong&gt; (&lt;code&gt;cap deploy:migrations&lt;/code&gt;) provést export nové revize kódu aplikace z verzovacího systému, nahrát ji na server, starou verzi uložit do archivu &lt;em&gt;releases&lt;/em&gt;, spustit migrace databázového schématu, restartovat webový server, a provést další řadu &lt;em&gt;maintenance&lt;/em&gt; úkolů, které pravděpodobně děláte ručně nebo vůbec. &lt;span class=&quot;note&quot;&gt;(Umožňuje vám např. také pomocí &lt;strong&gt;jednoho&lt;/strong&gt; příkazu &lt;code&gt;cap deploy:rollback&lt;/code&gt; vrátit aplikaci na serveru ke starší verzi, pokud omylem nasadíte verzi s chybou. Jak se vracíte k předchozí verzi vy?)&lt;/span&gt;&lt;/p&gt;

&lt;h2&gt;Pokračujte!&lt;/h2&gt;

&lt;p&gt;Blog &lt;em&gt;Karmi is on Rails&lt;/em&gt; bude v provozu ještě pár týdnů, než stařičká Rails aplikace (stále ještě běžící na přibalené archivní verzi Rails z května 2007) doslouží a bude nahrazena statickým obsahem. Všechny články tedy budou stále k nalezení na svých původních adresách. &lt;span class=&quot;note&quot;&gt;Konstruktivní i destruktivní komentáře můžete tedy v klidu zanechat níže :)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;O autorovy články ale přijít nemusíte. Chcete-li, můžete pokračovat na webu &lt;a href=&quot;http://www.restafari.org/&quot; title=&quot;Restafari.org by Karmi&quot;&gt;&lt;strong&gt;Restafari.org&lt;/strong&gt;&lt;/a&gt;, tentokrát však v &lt;em&gt;lingua franca&lt;/em&gt; internetu: angličtině. Není vyloučeno, že na adrese &lt;a href=&quot;http://www.restafari.cz&quot;&gt;&lt;strong&gt;www.restafari.cz&lt;/strong&gt;&lt;/a&gt; někdy v budoucnu najdete články v češtině, pravděpodobné to ale není.&lt;/p&gt;

&lt;p&gt;Autor děkuje ještě projednou všem milým komentářům a e-mailům, které po založení blogu obdržel. Pomohly-li vám články najít, získat nebo znovu nakopnout ztracenou energii &lt;strong&gt;něco dělat na webu&lt;/strong&gt;, podělte se o vaši &lt;em&gt;karmu&lt;/em&gt; v komentářích!&lt;/p&gt;

&lt;p&gt;Linkujte svoje blogy, svoje projekty! Založte si blog a pište o tom, co vás na Ruby/Rails baví a co ne! Navrhněte tričko pro &lt;a href=&quot;http://www.csrug.cz/&quot; title=&quot;Československé sdružení uživatelů programovacího jazyka Ruby, o.s. | CSRUG - Czechoslovakian Ruby Users Group&quot;&gt;CSRUG&lt;/a&gt;. Pošlete odkaz na &lt;a href=&quot;http://forum.rubyonrails.cz&quot;&gt;forum.rubyonrails.cz&lt;/a&gt;! Sestavte RSS agregátor z českých Ruby/Rails zdrojů a publikujte ho na webu, třebas jako &lt;a href=&quot;http://github.com/bmizerany/sinatra/&quot; title=&quot;bmizerany's sinatra at master &amp;mdash; GitHub&quot;&gt;Sinatra&lt;/a&gt; aplikaci! Když už nemůžete publikovat ucelené aplikace, publikujte alespoň &lt;a href=&quot;http://gist.github.com/&quot; title=&quot;Gist &amp;mdash; GitHub&quot;&gt;fragmenty kódu&lt;/a&gt;! Nechte už těch keců a &lt;em&gt;dělejte konečně něco!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=hBxZti_JyRo&amp;amp;fmt=18&quot;&gt;&lt;strong&gt;One Love!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-08-19:305</id>
    <published>2007-08-19T14:57:00+00:00</published>
    <updated>2007-08-28T07:55:41+00:00</updated>
    <category term="Rails"/>
    <category term="Web design"/>
    <link href="http://blog.karmi.cz/2007/8/19/co-je-ruby-on-rails-cast-4" rel="alternate" type="text/html"/>
    <title>Ruby on Rails a revoluce ve v&#253;voji pro web. Dokon&#269;en&#237;</title>
<summary type="html">&lt;p&gt;V závěrečné části seriálu se dozvíte o nástrojích, které nám Rails poskytují pro pohodlnější psaní aplikací, a ukážeme si na konkrétních příkladech, jak nám mohou usnadnit práci pluginy &lt;em&gt;acts as list&lt;/em&gt; a &lt;em&gt;acts as attachment&lt;/em&gt;. Můžete si také stáhnout ukázkovou mini-aplikaci, která všechny techniky a postupy našeho seriálu demonstruje.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;V závěrečné části seriálu se dozvíte o nástrojích, které nám Rails poskytují pro pohodlnější psaní aplikací, a ukážeme si na konkrétních příkladech, jak nám mohou usnadnit práci pluginy &lt;em&gt;acts as list&lt;/em&gt; a &lt;em&gt;acts as attachment&lt;/em&gt;. Můžete si také stáhnout ukázkovou mini-aplikaci, která všechny techniky a postupy našeho seriálu demonstruje.&lt;/p&gt;
&lt;p class=&quot;editors-note&quot;&gt;&lt;em&gt;Poznámka editora:&lt;/em&gt; Autor tohoto blogu neočekával komplikace při dokončování závěrečného článku seriálu. Stihnul se mezitím &lt;a href=&quot;http://www.karmi.cz/svatba/open_air_wedding.jpg&quot;&gt;oženit&lt;/a&gt; a stihnul pomoci &lt;a href=&quot;http://vaclav.vancura.org/&quot;&gt;kamarádovi&lt;/a&gt; s administračním rozhraním pro web ve Flashi :) Jak jinak než v Rails. Takže se můžete těšit o tutoriál o tom, jak v Rails zprovoznit podporu pro &lt;em&gt;Flash Remoting&lt;/em&gt;. Jako aktuální odčinění naleznete u tohoto článku malou &lt;a href=&quot;#ukazkova_miniapp&quot;&gt;ukázkovou aplikaci&lt;/a&gt;, která demonstruje všechny ty techniky, triky a strategie popsané v dosavadních čtyřech článcích.&lt;/p&gt;

&lt;p&gt;V předchozích částech seriálu jsme se seznámili se základními principy frameworku Ruby on Rails — s návrhovým vzorem &lt;em&gt;ActiveRecord&lt;/em&gt; a s konvencemi, které Rails extrahují ze zkušeností s vývojem webových aplikací (a zpětně je na něj aplikují). Tyto části frameworku silně inspirovaly mnoho dalších klonů (identické pojetí modelů a vztahu mezi &lt;em&gt;controllery&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt; najdete např. v &lt;a href=&quot;http://www.cakephp.org&quot;&gt;Cake PHP&lt;/a&gt;). V tomto článku náš úvodní seriál dokončíme výkladem o tom, co je v Rails z pohledu vývojáře, jeho produktivity a radosti při vývoji, ojedinělé.&lt;/p&gt;

&lt;h2&gt;Rozšíření a pomocné metody&lt;/h2&gt;

&lt;p&gt;Jak jsme viděli v předchozím článku o propojení &lt;em&gt;controllerů&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt;, principy Rails vycházejí z jednoduchých pravidel a konvencí webového vývoje: předej &lt;em&gt;identifikátor&lt;/em&gt; nějakého objektu určitému &lt;em&gt;controlleru&lt;/em&gt; a prostřednictvím jeho &lt;em&gt;metody&lt;/em&gt; s tímto objektem něco udělej. Název šablony odpovídá názvu metody. Název layoutu odpovídá názvu controlleru. A tak dále. &lt;/p&gt;

&lt;p&gt;Podobných &lt;strong&gt;opakujících se činností&lt;/strong&gt; najdeme při vývoji nekonečné množství: neustále musíme formátovat datum nebo čas a počítat rozdíly mezi nimi, formátovat velikost souborů a jiná „ošklivá“ čísla, vypisovat varovná hlášení pro položky formulářů, generovat opakující se části kódu se složitější logikou, … Nepřekvapí nás proto, když v Rails najdeme jak velké množství rozšíření pro nejčastější případy takových úkolů, tak transparentní mechanismus pro integrování rozšíření vlastních. Rails obsahují dvě základní rozšíření: rozšíření jazyka Ruby (&lt;em&gt;Core Extensions&lt;/em&gt;) a pomocné metody (&lt;em&gt;helpers&lt;/em&gt;) obsažené v modulu &lt;em&gt;Action View&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rozšíření jazyka Ruby&lt;/strong&gt; doplňují třídy &lt;code&gt;Array&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Hash&lt;/code&gt;, &lt;code&gt;Numeric&lt;/code&gt; a &lt;code&gt;String&lt;/code&gt; o „pohodlné“ metody (&lt;em&gt;convenience methods&lt;/em&gt;), které zjednodušují často se opakující operace — typicky např. zjištění, zda je číslo sudé či liché, které využijeme třeba pro střídání barvy pozadí řádků tabulky:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;1.even?
=&amp;gt; false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podobně pro definice velikosti souborů můžeme použít metody pracující s „lidštějšími“ tvary než je neustálé násobení a dělení číslem 1024 a jeho násobky:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;10.megabytes
=&amp;gt; 10485760
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Důležité je, že tato rozšíření jsou přidána přímo do Ruby, metody &lt;code&gt;even?&lt;/code&gt; nebo &lt;code&gt;megabytes&lt;/code&gt; lze tedy volat &lt;strong&gt;pro všechna čísla&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Většina těchto rozšíření posiluje &lt;strong&gt;expresivní charakter Ruby&lt;/strong&gt; — velmi často chceme kupříkladu vypsat položky pole (seznam kategorií nebo tagů) v čitelném, „neprogramátorském“ formátu: &lt;em&gt;„Zařazeno do kategorií Apple, iPhone a Mac OS X“&lt;/em&gt;. Pohodlná metoda &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Array/Conversions.html#M000372&quot;&gt;&lt;em&gt;to_sentence&lt;/em&gt;&lt;/a&gt; pro objekt &lt;code&gt;Array&lt;/code&gt; zařídí právě to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;['Hynek', 'Vilém', 'Jarmila'].to_sentence
=&amp;gt; &quot;Hynek, Vilém a Jarmila&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Standardně Rails pochopitelně vypíšou &lt;em&gt;„Hynek, Vilém and Jarmila“&lt;/em&gt;. Můžeme (jako obvykle) doplnit konfiguraci a napsat &lt;code&gt;['Hynek', 'Vilém', 'Jarmila'].to_sentence(:connector =&amp;gt; 'a')&lt;/code&gt;, anebo použít &lt;a href=&quot;http://agilewebdevelopment.com/plugins/localization_simplified&quot; title=&quot;Plugins - Localization Simplified - Agile Web Development&quot;&gt;lokalizační plugin&lt;/a&gt;, obsahující podporu i pro &lt;a href=&quot;http://pastie.caboo.se/79127&quot; title=&quot;Czech translation file for Localization simplified&quot;&gt;český jazyk&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Nepřekvapí nás, že nejvíce rozšíření nalezneme pro práci s datem a časem. Datová aritmetika („&lt;em&gt;články za poslední měsíc“&lt;/em&gt;) a formátování data a času jsou jedny z nejotravnějších činností při programování. Pokud bychom tedy chtěli vypsat seznam úkolů pro tento měsíc, napsali bychom:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@TodoItems = TodoItem.find( :all, 
                            :conditions =&amp;gt; &quot;due_date &amp;gt; '#{Time.now.at_beginning_of_month.to_s(:db)}' AND due_date &amp;lt; '#{Time.now.at_end_of_month.to_s(:db)}'&quot;, 
                            :order =&amp;gt; 'due_date' )
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pohodlná metoda &lt;code&gt;at_end_of_month&lt;/code&gt; nám vrací objekt třídy &lt;em&gt;Time&lt;/em&gt;, &lt;code&gt;Tue Jul 31 00:00:00 +0200 2007&lt;/code&gt;. Ten si jednoduše převedeme pomocí metody &lt;code&gt;to_s&lt;/code&gt; na řetězec v SQL formátu (viz parametr &lt;code&gt;:db&lt;/code&gt;), který můžeme využít v porovnávání. K zabudovaným formátům &lt;code&gt;:db&lt;/code&gt;, &lt;code&gt;:long&lt;/code&gt;, atd. můžeme pochopitelně &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/HowToDefineYourOwnDateFormat&quot; title=&quot;HowToDefineYourOwnDateFormat in Ruby on Rails&quot;&gt;přidat vlastní&lt;/a&gt; a využít je pak podle filosofie &lt;em&gt;Don't repeat yourself&lt;/em&gt; v dalším kódu. Pro datovou aritmetiku obsahují Rails &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html&quot; title=&quot;Module: ActiveSupport::CoreExtensions::Time::Calculations&quot;&gt;celou řadu rozšíření&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pomocné třídy Rails&lt;/strong&gt; se od rozšíření tříd Ruby liší — jsou automaticky dostupné pouze ve &lt;code&gt;view&lt;/code&gt;, nikoli v &lt;code&gt;controllerech&lt;/code&gt; a &lt;code&gt;modelech&lt;/code&gt;. &lt;span class=&quot;note&quot;&gt;(Lze je ale direktivou &lt;code&gt;include&lt;/code&gt; zpřístupnit i jim.)&lt;/span&gt; Slouží opět ke zjednodušení formátování a generování kódu, typicky formulářových prvků, odkazů (nám již dobře známá metoda &lt;code&gt;link_to&lt;/code&gt; nebo výstižně pojmenovaná &lt;code&gt;link_to_unless_current&lt;/code&gt;) či pro přístup k chybovým hlášením formulářových prků (&lt;code&gt;error_message_on&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Jedna z nejefektivnějších pomocných metod je ta s výstižným, byť krkolomným názvem &lt;code&gt;distance_of_time_in_words_to_now&lt;/code&gt;. Do jisté míry zavedla určitý &lt;strong&gt;návrhový vzor&lt;/strong&gt; pro „polidštění“ výpisu data a času. Byl-li např. článek &lt;strong&gt;publikován včera&lt;/strong&gt;, je většinou mnohem čitelnější říci o něm, že byl &lt;em&gt;publikován včera&lt;/em&gt;, než že byl &lt;em&gt;publikován 16. 7. 2007 v 18:15&lt;/em&gt;. &lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;Zde je zřetelně vidět inspirační zdroj v mentalitě &lt;a href=&quot;http://gettingreal.37signals.com/&quot; title=&quot;Getting Real: The Book by 37signals&quot;&gt;37Signals&lt;/a&gt;: snaha zbavit se žargonu, &lt;strong&gt;péče věnovaná jazyku&lt;/strong&gt;, kterým aplikace s uživateli „mluví“. Rozdíl mezi &lt;em&gt;publikován 16. 7. 2007 v 18:15&lt;/em&gt; a &lt;em&gt;publikován včera&lt;/em&gt; se může zdát nepodstatný, nezasluhující si zvláštní pozornosti, můžeme jej odsoudit jen jako „vychytávku“. Z pohledu uživatele však tento rozdíl může být propastný&lt;/p&gt;

&lt;p&gt;Jestliže s ním aplikace mluví o „Úkolech na zítra“ a „Změněno včera“, radikálně roste jeho důvěra v to, že má smysl ji používat, že mu &lt;strong&gt;rozumí&lt;/strong&gt; — neboť s ním mluví „jeho“ jazykem a neplete se mu do cesty. Neschopnost takové empatie na straně tvůrců aplikací je jedním z hlavních důvodů, proč aplikace tak často uživatele stresují. &lt;span class=&quot;note&quot;&gt;(Empatie se dá přitom samozřejmě karikovat a přehánět do podoby &lt;a href=&quot;http://www.spatne.cz/2007/7/20/prechytrale-aplikace&quot; title=&quot;špatně!: Přechytralé aplikace&quot;&gt;&lt;em&gt;přechytralých aplikací&lt;/em&gt;&lt;/a&gt;, které se stále ptají &lt;em&gt;„Zdá se, že na ploše jsou nepoužívané ikony, chcete je odstranit?“&lt;/em&gt;)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Podobné pobídky k „neprogramátorskému“ výpisu dat nalezneme napříč všemi pomocnými metodami, zvláště s ohledem na &lt;strong&gt;čísla&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;number_with_delimiter(1234567, &quot; &quot;)
=&amp;gt; &quot;1 234 567&quot;

number_with_precision(123.45678, 2)
=&amp;gt; &quot;123.46&quot;

number_to_human_size 10485760
=&amp;gt; &quot;10 MB&quot;
number_to_human_size 1572864
=&amp;gt; &quot;1.5 MB&quot;
number_to_human_size 125952 
=&amp;gt; &quot;123 KB&quot;

number_to_phone(123456789, :delimiter =&amp;gt; ' ', :country_code =&amp;gt; '420')
=&amp;gt; &quot;+420 12 345 6789&quot;

number_to_currency(12345, :unit =&amp;gt; 'Kč ', :separator =&amp;gt; ',', :delimiter =&amp;gt; ' ')
=&amp;gt; &quot;Kč 12 345,00&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mnoho dalších tipů pro práci s &lt;em&gt;helpery&lt;/em&gt; najdete v loňském &lt;a href=&quot;http://errtheblog.com/post/44&quot; title=&quot;err.the_blog.find_by_title('Rails Rubyisms Advent')&quot;&gt;&lt;em&gt;Adventním kalendáři pro Rails&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kromě zabudovaných pomocných metod v Rails nalezneme efektivní a transparentní mechanismus, jak vytvářet &lt;em&gt;helpery&lt;/em&gt; vlastní. Najdeme je ve složce &lt;code&gt;app/helpers&lt;/code&gt;, a její obsah může vypadat např. takto:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/8/19/helpers_folder.png&quot; alt=&quot;Rails Helpers Folder (/app/helpers/)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Soubor &lt;code&gt;application_helper.rb&lt;/code&gt; obsahuje pomocné metody dostupné &lt;strong&gt;všem&lt;/strong&gt; &lt;code&gt;views&lt;/code&gt; (to nás nepřekvapí, protože víme, jaký význam v Rails mají komponenty pojmenované &lt;em&gt;application&lt;/em&gt;: &lt;code&gt;layout/application.rhtml&lt;/code&gt;, &lt;code&gt;public/javascripts/application.js&lt;/code&gt;, atd.) Obsahuje-li naše aplikace &lt;em&gt;controller&lt;/em&gt; pojmenovaný &lt;em&gt;Todos&lt;/em&gt; (&lt;code&gt;controllers/todos_controller.rb&lt;/code&gt;), pro „jeho“ &lt;em&gt;views&lt;/em&gt; budou automaticky dostupné pomocné metody ze souboru &lt;code&gt;helpers/todos_helper.rb&lt;/code&gt;. &lt;span class=&quot;note&quot;&gt;Samozřejmě, jako obvykle metody definované v &lt;em&gt;helperech&lt;/em&gt; pro konkrétní &lt;em&gt;controllery&lt;/em&gt; přetěžují ty definované v &lt;code&gt;application_helper.rb&lt;/code&gt; přetěžují.&lt;/span&gt; A k čemu můžeme &lt;em&gt;helpery&lt;/em&gt; nejlépe využít?&lt;/p&gt;

&lt;p&gt;Typicky kupříkladu chceme, aby název stránky (&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;) byl na úvodní stránce webu jiný (&lt;em&gt;Veterinární klinika Jezevčí Skála: Nejlepší péče o vaše miláčky. Očkování, vyšetření, ošetření psů, koček a jiných domácích zvířat&lt;/em&gt;) než na stránkách ostatních (&lt;em&gt;Naše vybavení | Veterinární klinika Jezevčí Skála&lt;/em&gt;). Skládáme tedy název stránky z různých částí. Mohli bychom v šabloně zkusit něco jako&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;title&amp;gt;&amp;lt;%= if controller.action_name == 'index' then 'Veteri...' else &quot;@page.title | Veteri...&quot; end -%&amp;gt;&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ale víme, že takový kód je &lt;strong&gt;velmi špatně čitelný&lt;/strong&gt; a jako takový opět náchylný k chybám. Určitě by bylo efektivnější, kdybychom napsali prostě&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;title&amp;gt;&amp;lt;%= page_title -%&amp;gt;&amp;lt;/title&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;a metodu &lt;code&gt;page_title&lt;/code&gt; definovali právě pomocí &lt;em&gt;helperu&lt;/em&gt;. Protože název stránky je (většinou) záležitostí celé aplikace, bude nejlépe, když tuto metodu nadefinujeme v globálním &lt;code&gt;application_helper.rb&lt;/code&gt; například nějak takto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def page_title
   if controller.action_name == 'index'
     &quot;Veterinární klinika ... domácích zvířat&quot;
   else
     &quot;#{@page.title} | Veterinární klinika ...&quot;
   end
 end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Obrovskou zásobů &lt;em&gt;helperů&lt;/em&gt; obsahují Rails pro &lt;strong&gt;práci s formuláři&lt;/strong&gt;, kdy usnadňují zejména práci s předvyplňováním hodnot u &lt;em&gt;radio&lt;/em&gt; buttonů a u &lt;em&gt;select&lt;/em&gt; prvků. To je však rozhodně téma na zvláštní článek, a proto se k nim ještě někdy v budoucnu vrátíme.&lt;/p&gt;

&lt;p&gt;Nějaké ty pomocné rutiny, které do HTML vypíšou nějaký ten formulářový prvek má totiž leckterý &lt;em&gt;framework&lt;/em&gt;. Rails však mají pro vývojáře přichystány také pomocníky velmi specifické. Na tři z nich se nyní podíváme.&lt;/p&gt;

&lt;h2&gt;Generátory&lt;/h2&gt;

&lt;p&gt;Lze říci, že počítačové programy obecně řeší dva typy úloh: buď nějaké &lt;strong&gt;výpočetně velmi složité úkoly&lt;/strong&gt; (a fungují tedy jako „tisíc kalkulaček dohromady“) nebo &lt;strong&gt;opakující se a mechanické činnosti&lt;/strong&gt; — případně, a to nejčastěji, &lt;strong&gt;kombinaci obou&lt;/strong&gt;. Jak jsme viděli, vztahy mezi jednotlivými součástmi aplikace v Rails jsou postaveny na několika málo velmi dobře kodifikovaných principech. Není až takový problém si je zapamatovat — většinou stačí napsat to &lt;a href=&quot;http://en.wikipedia.org/wiki/Ruby_programming_language#Philosophy&quot; title=&quot;Ruby &amp;raquo; Philosophy - Wikipedia, the free encyclopedia&quot;&gt;první, co člověka napadne&lt;/a&gt;. Bylo by však dosti neefektivní stále dokola vytvářet nové soubory s &lt;em&gt;modely&lt;/em&gt; v příslušných složkách s příslušnými jmény a vepisovat do nich příslušné definice dědění tříd… Z tohoto důvodu obsahují Rails tzv. &lt;strong&gt;&lt;em&gt;generátory kódu&lt;/em&gt;&lt;/strong&gt; (&lt;em&gt;generators&lt;/em&gt;). Ty nám pomohou při vytváření nových &lt;em&gt;modelů&lt;/em&gt;, &lt;em&gt;controllerů&lt;/em&gt; a jiných součástí aplikace. Podíváme se podrobněji na to, co nám umožňují.&lt;/p&gt;

&lt;p&gt;Chceme-li v Rails vytvořit novou &lt;strong&gt;třídu objektů&lt;/strong&gt;, tedy nový &lt;em&gt;model&lt;/em&gt;, např. pro úkolovník, postačí, když vytvoříme ve složce &lt;code&gt;app/model&lt;/code&gt; soubor &lt;code&gt;todo_item.rb&lt;/code&gt;. Museli bychom ale jednak deklarovat jeho odvození z třídy &lt;em&gt;Active Record&lt;/em&gt;, jednak bychom nějak a &lt;em&gt;někde&lt;/em&gt; museli deklarovat jeho &lt;em&gt;datovou strukturu&lt;/em&gt; („po staru“ řečeno &lt;em&gt;sloupečky v tabulce&lt;/em&gt;), která je s ním těsně spjatá. V Rails nám totéž — a ještě více — vykoná &lt;strong&gt;jeden&lt;/strong&gt; příkaz:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate model TodoItem
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jeho zkrácený výstup vidíte níže:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;create  app/models/todo_item.rb
create  db/migrate/001_create_todo_items.rb
create  test/unit/todo_item_test.rb
create  test/fixtures/todo_items.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Generátor nám nejenom vytvořil soubor s &lt;em&gt;prázdným modelem Active Record&lt;/em&gt;, ale vygeneroval i soubory pro &lt;em&gt;testování&lt;/em&gt; (které prozatím necháme stranou) a soubor se zajímavým názvem &lt;code&gt;001_create_todo_items&lt;/code&gt;. Ten obsahuje silnou zbraň Rails jménem &lt;strong&gt;migrace&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Migrace &lt;strong&gt;odstiňují vývojáře&lt;/strong&gt; od definování datových struktur modelů (&lt;em&gt;sloupečků v tabulce&lt;/em&gt;) pomocí &lt;strong&gt;SQL příkazů&lt;/strong&gt; (&lt;code&gt;CREATE TABLE ...&lt;/code&gt;) a mají dvě základní výhody: jsou &lt;strong&gt;čitelnější&lt;/strong&gt; než SQL a tudíž méně náchylné k chybám v kódu a jsou &lt;strong&gt;přírůstkové&lt;/strong&gt; a &lt;strong&gt;odvolatelné&lt;/strong&gt;. Obsahují tak historii definic datové struktury aplikace, kterou lze vracet zpět, upravovat, jednoduše přidávat objektům nové atributy („&lt;em&gt;sloupečky“&lt;/em&gt;). &lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;Definice datové struktury tudíž může probíhat skutečně &lt;em&gt;agilně&lt;/em&gt;, z hlediska znalosti věcí v &lt;em&gt;daném okamžiku&lt;/em&gt; a vývojář se nemusí stresovat tím, jestli náhodou nepojmenoval nějaký &lt;em&gt;sloupeček&lt;/em&gt; špatně nebo jestli mu (bože!) v tom hezkém obrázku propojených tabulek náhodou některý nechybí a „zákazník to pak bude chtít…“&lt;/p&gt;

&lt;p&gt;Typická &lt;em&gt;migrace&lt;/em&gt; pro náš &lt;em&gt;model&lt;/em&gt; s úkoly může pak vypadat např. takto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CreateTodoItems &amp;lt; ActiveRecord::Migration
  def self.up
    create_table :todo_items do |t|
      t.column :title, :string
      t.column :due_date, :date
      t.column :completed, :boolean

      t.column :position, :integer
      t.column :created_at, :datetime
    end
  end

  def self.down
    drop_table :todo_items
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vidíme, že se jedná o standardní třídu Ruby, obsahující metody &lt;code&gt;up&lt;/code&gt; pro provedení migrace a &lt;code&gt;down&lt;/code&gt; pro její „odvolání“. Číslo &lt;code&gt;001&lt;/code&gt; v názvu souboru slouží pro identifikaci dané migrace. &lt;strong&gt;Migraci provedeme příkazem &lt;code&gt;rake db:migrate&lt;/code&gt;&lt;/strong&gt; pro změnu datové struktury aplikace na poslední definici v pořadí, příkazem &lt;code&gt;rake db:migrate VERSION=1&lt;/code&gt; se vrátíme na datovou strukturu odpovídající souboru &lt;code&gt;001_...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vidíme také, že definujeme objekt s atributy pro &lt;em&gt;název&lt;/em&gt;, &lt;em&gt;datum plánovaného dokončení&lt;/em&gt; a &lt;em&gt;informací o tom, zda byl úkol splněn&lt;/em&gt;, a to ve velmi srozumitelných datových typech &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;date&lt;/code&gt; a &lt;code&gt;boolean&lt;/code&gt;. &lt;span class=&quot;note&quot;&gt;(Rails obsahují abstraktní datový typ &lt;code&gt;boolean&lt;/code&gt; velmi dobře popsaný v knize &lt;em&gt;Agile Web Development With Ruby On Rails&lt;/em&gt;.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Řekněme, že v náhlém hnutí mysli se nám velmi &lt;strong&gt;znelíbí pojmenování pro atribut &lt;em&gt;názvu úkolu&lt;/em&gt;&lt;/strong&gt;, &lt;code&gt;title&lt;/code&gt;. Chtěli bychom, aby se jmenoval (logičtěji) &lt;code&gt;name&lt;/code&gt; a tento nedostatek nám v pokročilé hodině téměř znemožňuje programovat dále. Je třeba to napravit, a to co nejdříve. A nepřijít přitom o všechna data, která již databáze obsahuje — takže na nějaké to &lt;code&gt;DROP TABLE...&lt;/code&gt; můžeme zapomenout. &lt;em&gt;Generátor migrace&lt;/em&gt; obsažený v Rails nám pomůže právě v takové situaci. Jediné, co musíme udělat, je &lt;strong&gt;vymyslet srozumitelný název pro &lt;em&gt;migraci&lt;/em&gt;&lt;/strong&gt; a vyplnit údaje o tom, jak se má příslušný sloupeček příslušné tabulky přejmenovat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate migration ChangeAtrTitleOfTodoItemToName
=&amp;gt; create  db/migrate/002_change_atr_title_of_todo_item_to_name.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vygenerovaný soubor pak obsahuje prázdnou třídu &lt;em&gt;migrace&lt;/em&gt;, do níž doplníme jen těla metod &lt;code&gt;up&lt;/code&gt; a &lt;code&gt;down&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ChangeAtrTitleOfTodoItemToName &amp;lt; ActiveRecord::Migration
  def self.up
    # rename_column :table_name, :column_name, :new_column_name
    rename_column :todo_items, :title, :name
  end

  def self.down
    rename_column :todo_items, :name, :title
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Příkazem &lt;code&gt;rake db:migrate&lt;/code&gt; a restartem aplikace pak provedeme migraci na tuto definici. Z tohoto důvodu nečekejte u Rails aplikací žádné &lt;em&gt;SQL dumpy&lt;/em&gt; apod. Ty případně využijete jen pro přenášení dat — nikoliv datových struktur — mezi databázemi.&lt;/p&gt;

&lt;p&gt;Podobně snadno můžeme Rails nechat vytvořit soubory pro určitý &lt;em&gt;controller&lt;/em&gt; (např. &lt;code&gt;Article&lt;/code&gt;) a jeho metody (např. &lt;code&gt;index&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt; a &lt;code&gt;show&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate controller Article index list show

create  app/controllers/article_controller.rb
create  test/functional/article_controller_test.rb
create  app/helpers/article_helper.rb
create  app/views/article/index.rhtml
create  app/views/article/list.rhtml
create  app/views/article/show.rhtml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vidíme, že &lt;em&gt;generátor&lt;/em&gt; vytvořil soubory pro samotný &lt;em&gt;controller&lt;/em&gt;, jeho &lt;em&gt;helper&lt;/em&gt; a &lt;em&gt;test&lt;/em&gt;, stejně jako &lt;em&gt;views&lt;/em&gt; pro metody, které jsme uvedli při jeho volání. V postupně vznikajících &lt;a href=&quot;http://www.aptana.com/&quot; title=&quot;Aptana: The Web IDE&quot;&gt;IDE pro Rails&lt;/a&gt; nalezneme tyto &lt;em&gt;generátory&lt;/em&gt; obalené grafickým rozhraním, jejich funkce je ale totožná a možnosti stejné.&lt;/p&gt;

&lt;h2&gt;Konzole&lt;/h2&gt;

&lt;p&gt;Podobná specialita Rails, která se též odehrává v příkazové řádce, je &lt;strong&gt;konzole aplikace&lt;/strong&gt;, která se spouští příkazem &lt;code&gt;script/console&lt;/code&gt;. Umožňuje nám pracovat s &lt;em&gt;živou&lt;/em&gt;, běžící aplikací v prostředí terminálu. Ve fázi psaní kódu i pro rychlý pohled na data aplikace je její pomoc neocenitelná: umí číst data z &lt;em&gt;modelů&lt;/em&gt;, upravovat je a zase zapisovat, má přístup k &lt;em&gt;helper&lt;/em&gt; metodám a v omezené míře i ke &lt;em&gt;controllerům&lt;/em&gt;. Můžeme si tak &lt;strong&gt;vyzkoušet&lt;/strong&gt; různá formátování výstupu za pomoci &lt;em&gt;helperů&lt;/em&gt;, složitější operace s &lt;em&gt;modely&lt;/em&gt; „nanečisto“, bez použití prohlížeče, neustálého znovunačítání stránky a vypisování různých „pomocných“ &lt;em&gt;dumpů&lt;/em&gt;. Mnoho triviálních operací můžeme navíc provádět pouze přes konzoli a vůbec k nim nevytvářet grafické rozhraní v HTML a odpovídající controllery. Typickou takovou úlohou je např. změna hesla u nějaké velmi jednoduché aplikace bez složité struktury uživatelských práv:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/console production

u = User.find_by_login('admin')
=&amp;gt; #&amp;lt;User:0x35a0ed0 @attributes={&quot;name&quot;=&amp;gt;&quot;Administrator&quot;, ...
u.password = 'simsalabim'
=&amp;gt; &quot;simsalabim&quot;
u.save
=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A je to. Podobně neocenitelnou pomoc nám konzole poskytuje pro rychlý administrátorský zásah nebo rychlou kontrolu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;User.find_by_email('persona_non_grata@botmail.com').destroy!
=&amp;gt; true
User.find_all_by_is_logged_in(true).size
=&amp;gt; 21
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Z pohledu vývojáře je zkrátka konzole jedna z &lt;strong&gt;nejužitečnějších věcí v Rails&lt;/strong&gt;; nástroj, který šetří obrovské množství času a psaní různých podpůrných pseudo-metod &lt;em&gt;controllerů&lt;/em&gt; a pseudo-views pro ladění výstupu aplikace. Všechny příklady Rails kódu v našich článcích jsou prováděny právě v konzoli. Implicitně je konzole spuštěna v &lt;em&gt;development&lt;/em&gt; režimu aplikace — pokud bychom ji chtěli spustit nad „ostrými“ daty (což chceme dost často), musíme režim uvést při jejím spuštění: &lt;code&gt;script/console production&lt;/code&gt;. Rozsáhlý seznam tipů a triků pro práci v konzoli naleznete na &lt;a href=&quot;http://slash7.com/articles/2006/12/21/secrets-of-the-rails-console-ninjas&quot; title=&quot;Slash7 with Amy Hoy - Secrets of the Rails Console Ninjas&quot;&gt;blogu Amy Hoy&lt;/a&gt;, &lt;a href=&quot;http://errtheblog.com/post/26&quot; title=&quot;err.the_blog.find_by_title('irb Mix Tape')&quot;&gt;Err the Blog&lt;/a&gt; a v příslušné epizodě &lt;a href=&quot;http://railscasts.com/episodes/48&quot; title=&quot;Railscasts - Console Tricks&quot;&gt;Railscasts&lt;/a&gt;. Zde z nich uvedeme pouze dva nejužitečnější.&lt;/p&gt;

&lt;p&gt;Při práci v konzoli zároveň často měníte kód &lt;em&gt;modelu&lt;/em&gt;. Konzole však o změněném kódu neví. Abyste ji nemuseli stále ukončovat příkazem &lt;code&gt;exit&lt;/code&gt; a znovu startovat, postačí znovu načíst aplikaci příkazem &lt;code&gt;reload!&lt;/code&gt;. Druhým nedocenitelným tipem je zkratka pro zformátování výstupu do velmi čitelného &lt;a href=&quot;http://en.wikipedia.org/wiki/YAML&quot; title=&quot;YAML - Wikipedia, the free encyclopedia&quot;&gt;YAML formátu&lt;/a&gt; — postačí příkaz uvést jediným písmenem &lt;code&gt;y&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;y TodoItem.find(:all)
--- 
- !ruby/object:TodoItem 
  attributes: 
    name: &quot;Dopsat článek&quot;
    completed: f
    id: &quot;1&quot;
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ba co víc. Znak podtržítko slouží jako zkratka po vyvolání výstupu předchozího příkazu. Můžeme tedy psát příkazy „jak jsme zvyklí“, a jen výstup, který nás zajímá, rychle převést na YAML, aniž bychom museli daný příkaz psát znova.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;TodoItem.find(:all)
=&amp;gt; [#&amp;lt;TodoItem:0x362c91c @attributes={&quot;name&quot;=&amp;gt;&quot;Dopsat článek&quot;...]
y _
--- 
- !ruby/object:TodoItem 
  attributes: 
    name: &quot;Dopsat \xC4\x8Dl\xC3\xA1nek&quot;
        ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Konzole dokonce obsahuje všechny vlastnosti terminálu, na které jste zvyklí: šipkami nahoru a dolů se pohybujete v historii příkazů, pomocí &lt;code&gt;ctrl+R&lt;/code&gt; můžete v historii i vyhledávat, klávesa &lt;code&gt;tab&lt;/code&gt; doplňuje příkazy — těm, kteří se terminálu nebojí, tedy poskytuje maximální komfort a efektivitu při budování a ladění aplikace.&lt;/p&gt;

&lt;h2&gt;Pluginy a komunita&lt;/h2&gt;

&lt;p&gt;Protože &lt;em&gt;nejste sněhová vločka&lt;/em&gt;, je velká pravděpodobnost, že funkcionalitu, kterou potřebujete, potřeboval už dříve někdo před vámi. A ten někdo mohl být dokonce chytřejší než vy. Pro Rails existuje obrovské množství rozšíření formou &lt;strong&gt;pluginů&lt;/strong&gt;, od těch určených pro specifické případy, po pluginy, které řeší obecné problémy téměř každé aplikace. Podívejme se na dva takové případy.&lt;/p&gt;

&lt;p&gt;V aplikaci můžeme mít určitý &lt;strong&gt;uspořádaný seznam položek&lt;/strong&gt;: stránek v menu, souborů ke stažení, úkolů v úkolovníku. Položky se mohou vypisovat v určitém pořadí (podle data, názvu, apod.) nebo podle manuálně zadaného pořadového čísla. Je standardním požadavkem ze strany klienta, aby řazení položek bylo možné „manuálně“ ovlivnit i u takových seznamů, které jsou řazeny dle data — např. v případě výpisu tiskových zpráv. Tuto funkčnost je třeba implementovat &lt;strong&gt;snad v každé webové aplikaci&lt;/strong&gt;. Lze říci, že kde je nějaký podobný seznam, dříve či později se objeví požadavek na to, aby bylo možné jeho položky manuálně řadit. Nepřekvapí nás proto, že Rails obsahují standardně plugin s příznačným názvem &lt;strong&gt;&lt;em&gt;acts_as_list&lt;/em&gt;&lt;/strong&gt; — &lt;code&gt;TodoItem acts_as_list&lt;/code&gt; („Úkol se chová jako seznam“).&lt;/p&gt;

&lt;p&gt;Každému modelu můžeme jednoduše nastavit, že se &lt;em&gt;chová jako seznam&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class TodoItem &amp;lt; ActiveRecord::Base
    acts_as_list
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jediné, co musíme navíc udělat, je definovat v dané tabulce sloupeček s názvem &lt;code&gt;position&lt;/code&gt;. Pro instance třídy &lt;code&gt;TodoItem&lt;/code&gt; pak máme automaticky k dispozici &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Acts/List/InstanceMethods.html&quot; title=&quot;Module: ActiveRecord::Acts::List::InstanceMethods&quot;&gt;metody&lt;/a&gt; k pohodlné manipulaci s položkami seznamu: &lt;code&gt;move_higher&lt;/code&gt;, &lt;code&gt;move_lower&lt;/code&gt;, &lt;code&gt;move_to_top&lt;/code&gt;, &lt;code&gt;higher_item&lt;/code&gt; a další. V &lt;em&gt;controlleru&lt;/em&gt; si pak nadefinujeme jen jednoduché obslužné metody:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def move_higher
  if TodoItem.find(params[:id]).move_higher
    flash[:message] = &quot;Položka byla posunuta výše v seznamu&quot;
  else
    flash[:message] = &quot;Bohužel, položku se nepodařilo posunout&amp;amp;hellip;&quot;
  end
  redirect_to :action =&amp;gt; 'list'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;(Pro kompletní kód si &lt;a href=&quot;#ukazkova_miniapp&quot;&gt;stáhněte ukázkovou aplikaci&lt;/a&gt; z tohoto článku.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Psát podobnou funkcionalitu „vlastnoručně“ by bylo naprostým plýtváním času. Právě v těchto případech Rails oceníte nejvíce: vždy, když si uvědomíte, kolika vlastností dosáhnete prostými deklaracemi typu &lt;em&gt;acts_as_list&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Obsluha uspořádaného seznamu je ale pořád ještě slabý čaj proti &lt;strong&gt;práci se soubory nahrávanými do aplikace pomocí formulářů&lt;/strong&gt;: ošetřením práv, zmenšováním obrázků, hlídáním správných datových typů, … Právě pro práci s &lt;em&gt;uploady&lt;/em&gt; obsahují Rails plugin &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://technoweenie.stikipad.com/plugins/show/Acts+as+Attachment&quot; title=&quot;Acts as Attachment in Plugins&quot;&gt;acts&lt;em&gt;as_attachment&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;, resp. jeho novější inkarnaci &lt;em&gt;&lt;a href=&quot;http://clarkware.com/cgi/blosxom/2007/02/24#FileUploadFu&quot; title=&quot;Mike Clark's Weblog&quot;&gt;attachment&lt;/em&gt;fu&lt;/a&gt;&lt;/em&gt;. Tento plugin si musíme do aplikace nainstalovat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install acts_as_attachment
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pro uploadovaná data si vytvoříme &lt;em&gt;model&lt;/em&gt; a deklarujeme jeho chování:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Photo &amp;lt; ActiveRecord::Base
  acts_as_attachment  :storage =&amp;gt; :file_system, 
                      :max_size =&amp;gt; 3.megabytes, 
                      :content_type =&amp;gt; :image,
                      :resize_to =&amp;gt; '800x&amp;gt;',
                      :thumbnails =&amp;gt; { :small =&amp;gt; '125&amp;gt;', :tiny =&amp;gt; '25&amp;gt;' }                      
  validates_as_attachment
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vidíme, že definujeme způsob ukládání dat (na disku), maximální velikost (3 MB), povolený typ souborů (pouze obrázky) a necháváme je zmenšit na 800 pixelů na šířku. Zároveň vytváříme dva thumbnaily (&lt;em&gt;small&lt;/em&gt; a &lt;em&gt;tiny&lt;/em&gt;) o velikostech 125 a 25 pixelů na šířku. Na posledním řádku deklarujeme, že se má před uložením objektu provést validace — zda vůbec něco bylo nahráno, zda není nahrávaný dokument větší, než povolené tři megabyty a zda má správný &lt;em&gt;mime-type&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Jediné, co musíme zajistit ve &lt;em&gt;view&lt;/em&gt;, je to, aby se příslušný &lt;em&gt;file input&lt;/em&gt; jmenoval korektně, tedy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;file_field :photo, :uploaded_data
=&amp;gt; &amp;lt;input id=&quot;photo_uploaded_data&quot; name=&quot;photo[uploaded_data]&quot; type=&quot;file&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;V &lt;em&gt;controlleru&lt;/em&gt; pak jednoduše zavoláme:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@photo = Photo.create(params[:photo])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Což je jen zkratka pro případný zápis &lt;code&gt;Photo.create(:uploaded_data =&amp;gt; params['nahrany_soubor'])&lt;/code&gt;. V&amp;nbsp;případě, že data z formuláře odesíláme „zabalená” v kontejneru &lt;em&gt;photo&lt;/em&gt; a nazvaná &lt;code&gt;uploaded_data&lt;/code&gt;, vystačíme si s kratším zápisem. V každém případě pozorně sledujte log soubory (&lt;em&gt;log/development.log&lt;/em&gt; a &lt;em&gt;log/production.log&lt;/em&gt;), jestliže vám něco nefunguje – dozvíte se přesně, s jakými parametry voláte metody a pod jakým názvem vám uploadovaný soubor přichází.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Soubor pak máme uložen jak na disku, tak v databázi a můžeme k němu a k jeho atributům snadno přistupovat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;photo = Photo.find(:first)
=&amp;gt; #&amp;lt;Photo:0x3576c84 @attributes={&quot;content_type&quot;=&amp;gt;&quot;image/jpeg&quot;, &quot;size&quot;=&amp;gt;&quot;132716&quot;, ...
number_to_human_size photo.size
=&amp;gt; &quot;129.6 KB&quot;
photo.content_type
=&amp;gt; &quot;image/jpeg&quot;
photo.width
=&amp;gt; 500
photo.public_filename
=&amp;gt; &quot;/photos/1/sample-image-01.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Pokud si budete chtít výše uvedený Ruby kód vyzkoušet v Rails konzoli, nezapomeňte nejprve nalinkovat helpery pro čísla: &lt;code&gt;include ActionView::Helpers::NumberHelper&lt;/code&gt;. Konzole je sama od sebe připojené nemá.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Na disku ukládá plugin &lt;em&gt;&lt;em&gt;acts&lt;/em&gt;as&lt;em&gt;attachment&lt;/em&gt;&lt;/em&gt; dokumenty do podsložky pojmenované stejně jako tabulka pro daný &lt;em&gt;model&lt;/em&gt;, v našem případě tedy &lt;code&gt;photos&lt;/code&gt;, a pro každý dokument vytváří dále podsložky pojmenované podle jejich &lt;em&gt;ID&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/8/19/folder_pro_acts_as_attachment.png&quot; alt=&quot;Složka, kam acts_as_attachment ukládá soubory&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ve &lt;em&gt;view&lt;/em&gt;, kde chceme daný soubor zobrazit, pak jen jednoduše napíšeme:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;%= image_tag photo.public_filename(:small) # Malý thumbnail %&amp;gt;
&amp;lt;%= image_tag photo.public_filename         # Plná velikost %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jak vidíme, práce s uploady je díky pluginu &lt;em&gt;acts&lt;em&gt;as_attachment&lt;/em&gt; zcela jednoduchá. Rails však obsahují ve svých útrobách skrytou ještě jednu _vychytávku&lt;/em&gt;: třídu &lt;a href=&quot;http://api.rubyonrails.org/classes/ActionController/TestUploadedFile.html&quot; title=&quot;Class: ActionController::TestUploadedFile&quot;&gt;TestUploadedFile&lt;/a&gt;. Ta je primárně určena především k testování &lt;em&gt;uploadů&lt;/em&gt;, jak její název napovídá. Můžeme ji ale skvěle využít k něčemu jinému: k &lt;strong&gt;automatizovanému importu dat z disku do naší aplikace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Představme si, že programujeme fotogalerii, a fotografie máme na disku. Chceme využít plugin &lt;em&gt;acts_as_attachment&lt;/em&gt; a mít všechny fotografie přístupné jako objekty v Rails. Jistě nebudeme stovku fotografií uploadovat jednu po druhé pomocí formuláře v HTML stránce. Napíšeme si importní metodu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# class Photo
def self.import_photo file
    raise &quot;PhotoNotFound (#{file})&quot; unless File.exists? file
    self.create( :uploaded_data =&amp;gt; ActionController::TestUploadedFile.new(file, 'image/jpeg') )
    print &quot;.&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nyní nám jen stačí projít celý adresář a fotografie naimportovat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# class Photo
def self.import_directory dir
    t = Time.now
    count ||= 0
    Dir.foreach(dir) do |file|
        # Trivialni kontrola vyhovujicich souboru
        if file.to_s.downcase.include? &quot;jpg&quot;
            Photo.import_file &quot;#{dir}/#{file}&quot;
            count += 1
        end
    end
    puts &quot;\n-- Nahrál jsem #{@count} fotografií z adresáře #{dir} za #{Time.now-t} sekund\n\n&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tyto metody nyní můžeme spustit pomocí Rails &lt;em&gt;konzole&lt;/em&gt;, nebo je můžeme pouštět třeba periodicky pomocí &lt;code&gt;cronu&lt;/code&gt; a &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/RunnerScript&quot; title=&quot;RunnerScript in Ruby on Rails&quot;&gt;&lt;code&gt;script/runner&lt;/code&gt;&lt;/a&gt;. Můžeme tak pomocí dvou metod o sedmnácti řádcích naplnit databázi stovkami megabytů dat, která pak máme ve webové aplikaci &lt;strong&gt;přístupná jako objekty v databázi&lt;/strong&gt;. Co to přesně znamená? Stačí jen trochu &lt;strong&gt;rozpálit fantazii&lt;/strong&gt; a představit si, že pomocí &lt;em&gt;callbacku&lt;/em&gt; &lt;code&gt;before_save&lt;/code&gt; a funkce &lt;code&gt;get_exif_by_entry&lt;/code&gt; RMagicku přečteme data třebas o fotoaparátu a můžeme si dělat podobně krásné statistky &lt;a href=&quot;http://flickr.com/cameras/&quot; title=&quot;Flickr: Camera Finder&quot;&gt;jako má Flickr&lt;/a&gt;… a s &lt;a href=&quot;http://nubyonrails.com/pages/gruff&quot; title=&quot;Gruff Graphs for Ruby | Ruby on Rails for Newbies&quot;&gt;takovými hezkými grafy&lt;/a&gt;…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://agilewebdevelopment.com/plugins/&quot; title=&quot;Ruby on Rails Plugins - Agile Web Development&quot;&gt;Pluginy pro Rails&lt;/a&gt; a &lt;a href=&quot;http://www.ruby-doc.org/stdlib/&quot; title=&quot;Ruby Standard Library Documentation&quot;&gt;knihovny (&lt;em&gt;standard libraries&lt;/em&gt;)&lt;/a&gt; nebo &lt;a href=&quot;http://www.root.cz/clanky/utilitky-pro-ruby-balickovaci-system-rubygems/&quot; title=&quot;Utilitky pro Ruby: balíčkovací systém RubyGems - Root.cz&quot;&gt;balíčky (&lt;em&gt;rubygems&lt;/em&gt;)&lt;/a&gt; pro Ruby jsou totiž možná to úplně nejlepší na psaní aplikací v Rails. Máloco vás potěší tak jako to, když zjistíte, že funkčnost, kterou potřebujete, napsal už někdo před vámi, a možná dokonce i líp, než byste to udělali vy. Pluginy a gemy jsou takový svět Rails/Ruby v malém — základní infrastrukturu máte hotovou, &lt;strong&gt;nemusíte&lt;/strong&gt; o ní přemýšlet a &lt;strong&gt;nemusíte&lt;/strong&gt; ji programovat. Můžete se zabývat „detaily“, které celý svět tak obdivuje na &lt;em&gt;Basecampu&lt;/em&gt;, &lt;em&gt;Flickru&lt;/em&gt;, &lt;em&gt;Joyent Connectoru&lt;/em&gt;. Můžete zkrátka řešit věci, které jsou z pohledu uživatelů vaší aplikace daleko důležitější než „prostá funkcionalita“. Tu očekávají automaticky — neohromíte je tím, že jim ukážete pár &lt;em&gt;text fieldů&lt;/em&gt; ve formuláři, pomocí nichž mohou zadat novou fakturu do účetní aplikace. Pluginy, gemy a ostatní rozšíření vám šetří čas, který můžete věnovat úplně jiným věcem.&lt;/p&gt;

&lt;p&gt;Například podobně standardní potřebou jako manipulace s položkami uspořádaného seznamu nebo &lt;em&gt;upload&lt;/em&gt; souborů je i to, aby vám aplikace poslala e-mailem notifikaci, když dojde k nějaké chybě či výjimce. Pro Rails existuje výborný plugin &lt;a href=&quot;http://agilewebdevelopment.com/plugins/exception_notifier&quot; title=&quot;Plugins - Exception Notifier - Agile Web Development&quot;&gt;Exception Notifier&lt;/a&gt;, který vám zašle vyčerpávající informaci o tom, jaká chyba v aplikaci nastala, při jakém requestu, jaký řádek kódu chybu způsobil. A vy se můžete zabývat sortováním takových mailů, nebo třeba jejich automatickým parsováním do &lt;em&gt;ticket&lt;/em&gt; systému...&lt;/p&gt;

&lt;p&gt;Co když ale potřebujete něco méně obvyklého? Chtěli byste například exportovat ActiveRecord &lt;em&gt;recordsety&lt;/em&gt; do &lt;acronym title=&quot;Comma Separated Values&quot;&gt;CSV&lt;/acronym&gt; formátu. A ejhle, on existuje pěkně napsaný plugin &lt;a href=&quot;http://agilewebdevelopment.com/plugins/convertible_to_csv&quot; title=&quot;Plugins - convertible to csv - Agile Web Development&quot;&gt;&lt;em&gt;convertible&lt;em&gt;to_csv&lt;/em&gt;&lt;/a&gt;. Potřebujete provést request na nějaké URL na internetu a zpracovat je? Využijete už nám dobře známou knihovnu &lt;a href=&quot;http://www.ruby-doc.org/docs/ProgrammingRuby/html/lib_network.html#Net::HTTP.new&quot; title=&quot;Programming Ruby: The Pragmatic Programmer's Guide&quot;&gt;&lt;/em&gt;Net::HTTP_&lt;/a&gt;. Chcete použít jako datové úložiště třeba &lt;a href=&quot;http://docs.google.com/&quot;&gt;Google Spreadsheet&lt;/a&gt;? Stáhněte si knihovnu &lt;a href=&quot;http://rubyforge.org/projects/gdata-ruby&quot; title=&quot;RubyForge: Google GData API access via Ruby wrapper: Project Info&quot;&gt;GData Ruby&lt;/a&gt; a polovinu práce máte hotovou.&lt;/p&gt;

&lt;p&gt;Samozřejmě, ne &lt;strong&gt;všechno&lt;/strong&gt; v Ruby a pro Ruby je ukázkou elegantního kódu. (I když ty nejhorší výstřelky bývají dost často portem z jiného jazyka.) Díky úspornosti a čitelnosti kódu v Ruby vám ale trvá neporovnatelně méně času přepsat části kódu podle „svého“. &lt;/p&gt;

&lt;p&gt;Okolo Ruby a Rails však především existuje na celém světě přátelská, energická komunita programátorů, vývojářů a web designérů, takže pokud vládnete angličtinou, najdete na &lt;a href=&quot;http://www.planetrubyonrails.com/&quot;&gt;blozích&lt;/a&gt; a &lt;a href=&quot;http://groups.google.com/group/rubyonrails-talk/&quot; title=&quot;Ruby on Rails: Talk -- Google Groups&quot;&gt;diskusních fórech&lt;/a&gt; spřízněných s Rails jedny z nejzajímavějších a nejtalentovanějších tvůrců dneška. &lt;/p&gt;

&lt;p&gt;Ruby on Rails je jedním z nejpoutavějších duchovních výkonů v oblasti informačních technologií za poslední dekádu: zcela změnil zavedené postupy ve vývoji pro web, a za jeho vlak se dále připojují vagony &lt;em&gt;Standardizace deploymentu&lt;/em&gt;, &lt;em&gt;Integrace version-control&lt;/em&gt;, &lt;em&gt;Výstup v různých formátech pomocí &lt;code&gt;respond_to&lt;/code&gt;&lt;/em&gt;, &lt;em&gt;Sdílené aplikační rozhraní aplikací — REST&lt;/em&gt;, &lt;em&gt;Škálování aplikací&lt;/em&gt;, …  Právem za Rails David Heinemeier Hansson obdržel cenu 2005 &lt;a href=&quot;http://osdir.com/Article6677.phtml&quot; title=&quot;Awarded: $25G in Google-O'Reilly Open Source Awards :: OSDir.com :: Open Source, Linux News &amp;amp; Software&quot;&gt;&lt;strong&gt;Open Source Best Hacker&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;V současné době je již samotný kód Rails dílem &lt;a href=&quot;http://dev.rubyonrails.org/report/36&quot; title=&quot;{36 All ticket activity, weighted totals - Rails Trac - Trac}&quot;&gt;mnoha a mnoha přispěvatelů&lt;/a&gt;, nikoliv solitérským geniálním činem. Právě účast na tomto „společném díle“, objevování netušených možností Ruby a Rails, integrování funkcí a vlastností, které byste si v jiných jazycích a &lt;em&gt;frameworcích&lt;/em&gt; dvakrát rozmysleli, je to co přináší vývojářům v Rails takovou &lt;strong&gt;radost z práce&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Tento „nakažlivý optimismus“ lidí okolo Rails je možná jedním ze zdrojů nedůvěry a obav, které se v souvislosti s Rails stále dokola objevují. &lt;em&gt;Práce&lt;/em&gt; má být přece &lt;em&gt;otrava&lt;/em&gt;. Pro vývoj v Rails to ale tak úplně neplatí. Existuje-li něco srovnatelného s &lt;strong&gt;radostí ze hry&lt;/strong&gt; (běžně chápané jako protiklad práce, neboť nevytváří žádnou hodnotu), je to psaní webové aplikace v Rails… &lt;span class=&quot;note&quot;&gt;A začnou-li vás Rails bavit doopravdy, můžete nejen začít opravovat a vylepšovat Rails samotné, ale také si nabrousit ostruhy v &lt;a href=&quot;http://www.workingwithrails.com/hackfest/&quot; title=&quot;Working With Rails - Hackfest&quot;&gt;utkání nejlepších Rails &lt;em&gt;hackerů&lt;/em&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;O Rails už každém případě víte dost na to, abyste se mohli rozhodnout, zda-li vás zajímají a mohou vám přinést nějaký užitek. Tímto článkem jsme skončili náš úvod o nejdůležitějších principech Rails. V dalších článcích se podíváme podrobněji na syntaxi jazyka Ruby, abychom porozuměli všem jejím zákoutím, a budeme se věnovat konkrétním návodům a postupům v Rails. Mezi připravená témata patří práce s formuláři a &lt;a href=&quot;http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html&quot; title=&quot;Module: ActionView::Helpers::PrototypeHelper&quot;&gt;Ajax v Rails&lt;/a&gt;, nasazení aplikací na serveru (&lt;em&gt;deployment&lt;/em&gt;), implementace &lt;a href=&quot;http://www.oreillynet.com/catalog/flashremoting/&quot; title=&quot;O'Reilly Media -- Bookstore: Flash Remoting: The Definitive Guide&quot;&gt;Flash Remoting&lt;/a&gt; a další. A samozřejmě též slíbený článek o Rails z pohledu projektových manažerů a vůbec „neprogramátorů“. Máte-li návrh na nějakou problematiku, o níž byste se chtěli dozvědět více, využijte komentáře k článku!&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Obrovský dík tentokrát patří Jiřímu Kubíčkovi za chladnokrevnou asistenci při zprovozňování Rails, SQLite a RMagicku na Windows XP, aby si autor sám prošel trnitou cestu, již budou muset projít ti z čtenářů, kteří si budou chtít ukázkovou aplikaci rozběhat v tomto operačním systému.&lt;/span&gt;&lt;/p&gt;

&lt;p class=&quot;hr&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Výukovou mini-aplikaci doprovázející tento seriál článků si můžete stáhnout, abyste si vše mohli vyzkoušet v pohodlí svého &lt;em&gt;http://127.0.0.1&lt;/em&gt;:&lt;/p&gt;

&lt;p class=&quot;link zip&quot;&gt;&lt;a href=&quot;http://rails-demo-app-by-karmi.googlecode.com/files/rails_demonstration_app.zip&quot;&gt;&lt;strong&gt;rails_demonstration_app.zip&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Je vhodná i pro naprosté začátečníky v Rails, obsahuje celou řadu doporučených postupů při vývoji v Rails, a na 120 řádcích kódu pokrývá tato témata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Použití metod &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;update_attributes&lt;/code&gt; a &lt;code&gt;toggle&lt;/code&gt; ActiveRecordu, definování vlastních metod pro třídu i instanci &lt;em&gt;modelu&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Práci s layouty, kombinaci &lt;em&gt;scaffoldu&lt;/em&gt; v Rails a vlastních metod &lt;em&gt;controllerů&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Metody &lt;em&gt;controllerů&lt;/em&gt; pro zobrazování i manipulaci s objekty, včetně ošetření chyb, přesměrování&lt;/li&gt;
&lt;li&gt;Definování vlastních &lt;em&gt;helperů&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Ukázky &lt;em&gt;embedded Ruby&lt;/em&gt; (ERB) v šablonách, ukázky volání &lt;em&gt;parciálních šablon&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Použití pluginu &lt;em&gt;acts_as_list&lt;/em&gt; a využití jeho metod pro manipulaci s objekty v controllerech&lt;/li&gt;
&lt;li&gt;Použití pluginu &lt;em&gt;acts_as_attachment&lt;/em&gt; pro upload obrázků do aplikace a jejich zmenšování&lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
&lt;p class=&quot;inline&quot;&gt;&lt;img title=&quot;&quot; src=&quot;/assets/2007/8/19/app_screenshot_01.png&quot; alt=&quot;Screenshot ukázkové aplikace&quot; /&gt;&lt;/p&gt;
&lt;div&gt;
    Aplikace vyžaduje jako databázi 
    &lt;a href=&quot;http://www.sqlite.org/&quot; title=&quot;SQLite home page&quot;&gt;SQLite&lt;/a&gt; nebo 
    &lt;a href=&quot;http://mysql.org/&quot; title=&quot;MySQL AB ::  Developer Zone&quot;&gt;MySQL&lt;/a&gt;, pro zmenšování obrázků pak 
    &lt;a href=&quot;http://www.imagemagick.org/&quot; title=&quot;ImageMagick: Convert, Edit, and Compose Images&quot;&gt;ImageMagick&lt;/a&gt; a 
    &lt;a href=&quot;http://rmagick.rubyforge.org/&quot; title=&quot;RMagick Download Page&quot;&gt;RMagick&lt;/a&gt;. 
    Podrobný návod naleznete přibalený k aplikaci v 
    &lt;a href=&quot;http://pastie.caboo.se/89045&quot;&gt;&lt;code&gt;doc/README_FOR_APP&lt;/code&gt;&lt;/a&gt;. 
    Pokud se dostanete do nesnází, využijte komentářů k článku, 
    &lt;a href=&quot;http://forum.rubyonrails.cz/&quot;&gt;diskusního fóra na Rubyonrails.cz&lt;/a&gt; nebo 
    IRC kanálu &lt;code&gt;#rubyonrails&lt;/code&gt; na irc.felk.cvut.cz.
&lt;/div&gt;

&lt;div class=&quot;cleaner&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-07-26:136</id>
    <published>2007-07-26T14:02:00+00:00</published>
    <updated>2007-07-26T14:52:49+00:00</updated>
    <category term="Rails"/>
    <link href="http://blog.karmi.cz/2007/7/26/railscamp-2" rel="alternate" type="text/html"/>
    <title>Poj&#271;te do kina na Ruby on Rails!</title>
<summary type="html">&lt;p&gt;Přijďte ve čtvrtek 2. srpna na druhé setkání příznivců Ruby a Ruby on Rails, tentokrát s&amp;nbsp;promítáním v kině Světozor!&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Přijďte ve čtvrtek 2. srpna na druhé setkání příznivců Ruby a Ruby on Rails, tentokrát s&amp;nbsp;promítáním v kině Světozor!&lt;/p&gt;
&lt;p&gt;Pravidelná &lt;a href=&quot;http://www.flickr.com/photos/vsuchy/sets/72157600649253533/&quot; title=&quot;Prague RoR meetup 1 - a photoset on Flickr&quot;&gt;setkání&lt;/a&gt; příznívců (příp. též odpůrců) Ruby a Ruby on Rails pokračují i v srpnu. Tentokrát se sejdeme za týden, ve &lt;strong&gt;čtvrtek 2. 8. ve 20.00&lt;/strong&gt; v pražském &lt;a href=&quot;http://www.kinosvetozor.cz/cz/&quot;&gt;&lt;strong&gt;Kině Světozor&lt;/strong&gt;&lt;/a&gt; a na programu máme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Promítání videa &lt;a href=&quot;http://peepcode.com/products/rails-from-scratch-part-i&quot; title=&quot;Rails from Scratch Part I | PeepCode Screencasts for Ruby on Rails Developers&quot;&gt;&lt;strong&gt;Rails From Scratch, Part 1&lt;/strong&gt;&lt;/a&gt;, 78minutového &lt;em&gt;screencastu&lt;/em&gt; od &lt;a href=&quot;http://nubyonrails.com/&quot; title=&quot;Nuby on Rails | Ruby on Rails for Newbies&quot;&gt;Geoffreyho Grosenbacha&lt;/a&gt; v angličtině o základech Rails, jejich adresářové struktuře, pomocných metodách, &lt;em&gt;controllerech&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt;, apod. Jestliže vás zaujaly úvodní články o Rails na tomto blogu, nenechte si jej ujít.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Přednáška o testování v Rails od &lt;a href=&quot;http://blog.flempo.cz/&quot; title=&quot;Flempo&quot;&gt;&lt;strong&gt;Jana Kubra&lt;/strong&gt;&lt;/a&gt; ukáže praktické postupy při využití integrovaných testovacích nástrojů v Ruby on Rails&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Screencast&lt;/em&gt; je vhodný pro programátory i „neprogramátory“ — obsahuje sice doopravdové ukázky kódu v Ruby, ale vše vysvětluje a je prost žargonu. Za &lt;em&gt;screencast&lt;/em&gt; od vás organizátoři budou žádat malý finanční příspěvek na pronájem sálu, odměnou vám bude dárek v několikanásobně vyšší hodnotě. :)&lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;
&lt;a href=&quot;http://www.kinosvetozor.cz/img/sal2.jpg&quot;&gt;Kapacita sálu&lt;/a&gt; ve Světozoru je omezená, proto se prosím &lt;a href=&quot;http://forum.rubyonrails.cz/forums/1/topics/13&quot; title=&quot;Setkání č. 2 - 2.8.2007 - Ruby on Rails Fórum&quot;&gt;&lt;strong&gt;registrujte na fóru RubyOnRails.cz&lt;/strong&gt;&lt;/a&gt;!
&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/7/26/peepcode.png&quot; alt=&quot;Peepcode: Rails From Scratch, Part 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Do čtvrtečního setkání se můžete těšit na dokončení našeho úvodního seriálu o Ruby on Rails.&lt;/span&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-07-03:84</id>
    <published>2007-07-03T00:18:00+00:00</published>
    <updated>2007-07-06T13:56:11+00:00</updated>
    <category term="Rails"/>
    <link href="http://blog.karmi.cz/2007/7/3/co-je-ruby-on-rails-cast-3" rel="alternate" type="text/html"/>
    <title>Ruby on Rails a revoluce ve v&#253;voji pro web. &#268;&#225;st t&#345;et&#237;: Controller a view</title>
<summary type="html">&lt;p&gt;V předchozích článcích jsme se zabývali filosofickými východisky jazyka Ruby a tím, jak na ně Rails navazují prostřednictvím výkladu o Active Record. Dnes si řekneme, jak Rails řeší prezentační vrstvu aplikace – vztah mezi &lt;em&gt;controllery&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt;.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;V předchozích článcích jsme se zabývali filosofickými východisky jazyka Ruby a tím, jak na ně Rails navazují prostřednictvím výkladu o Active Record. Dnes si řekneme, jak Rails řeší prezentační vrstvu aplikace – vztah mezi &lt;em&gt;controllery&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;V minulých dvou článcích (&lt;a href=&quot;/2007/6/16/co-je-ruby-on-rails-cast-1&quot;&gt;první část&lt;/a&gt;, &lt;a href=&quot;/2007/6/16/co-je-ruby-on-rails-cast-2&quot;&gt;druhá část&lt;/a&gt;) jsme se zabývali základními principy programovacího jazyka Ruby a frameworku Ruby on Rails, s konkrétním výkladem o jeho části &lt;em&gt;Active Record&lt;/em&gt; (tedy onomu &lt;em&gt;M&lt;/em&gt; v &lt;em&gt;MVC&lt;/em&gt;). V dnešním článku bych chtěl pokračovat výkladem o zbývajících dvou součástech MVC: &lt;em&gt;Controlleru&lt;/em&gt; a &lt;em&gt;View&lt;/em&gt;. V článku následujícím náš úvod o tom, co je na &lt;em&gt;Ruby on Rails&lt;/em&gt; pro programátory tak uchvacující, dokončíme.&lt;/p&gt;

&lt;h2&gt;URL jako rozhraní aplikace&lt;/h2&gt;

&lt;p&gt;Prozatím jsme si probrali jen jednu část z Model-View-Controller schématu, tedy &lt;em&gt;model&lt;/em&gt; implementovaný pomocí návrhového vzoru &lt;em&gt;ActiveRecord&lt;/em&gt;. Typická (nejen) webová aplikace potřebuje nejenom přistupovat ke zdrojům dat, ale také sbírat požadavky zvenčí a prezentovat na jejich základě výstup. Základním prvkem tohoto principu je &lt;strong&gt;směrování&lt;/strong&gt;, anglicky &lt;em&gt;routing&lt;/em&gt;, které zajištuje, že aplikace „ví“, na jaké prvky má směrovat konkrétní požadavek.&lt;/p&gt;

&lt;p&gt;Typickým takovým „požadavkem zvenčí“ je pro webové aplikace &lt;strong&gt;URL&lt;/strong&gt;, ať již je návštěvník zadá přímo, či klepne na odkaz nebo tlačítko ve formuláři. Dlouho se URL ve webových aplikacích bralo jako pouhý transportní mechanismus, u něhož nezáleží na tom, jak vypadá, jak je dlouhý, zda je čitelný. Proto jsme se setkávali (a leckdy i dnes setkáváme) s URL ve tvaru:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://example.com/exec/default?action=list&amp;amp;template=article_list&amp;amp;currPage=2&amp;amp;order=DESC&amp;amp;showonly=title,perex&amp;amp; …
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Takové URL má dvě základní vlastnosti: je &lt;strong&gt;maximálně pohodlné&lt;/strong&gt; pro programátora a &lt;strong&gt;maximálně nepohodlné&lt;/strong&gt; pro uživatele. Avšak dle pregnantního &lt;a href=&quot;http://www.useit.com/alertbox/990321.html&quot; title=&quot;URL as UI (Alertbox, March 21, 1999)&quot;&gt;vyjádření&lt;/a&gt; Jakoba Nielsena je &lt;strong&gt;URL součástí grafického rozhraní aplikace&lt;/strong&gt;. Lidé si URL posílají e-mailem, diktují do telefonu a dle &lt;a href=&quot;ftp://ftp.research.microsoft.com/pub/tr/TR-2007-01.pdf&quot; title=&quot;An eye-tracking study of information usage in Web search: Variations in target position and contextual snippet length, s. 9 -- PDF, 650KB&quot;&gt;výzkumné zprávy Microsoftu&lt;/a&gt; &lt;span class=&quot;note&quot;&gt;(PDF, 650KB)&lt;/span&gt; věnují až &lt;strong&gt;čtvrtinu času stráveného prohlížením výsledků vyhledávání&lt;/strong&gt; právě „adresám stránek“.&lt;/p&gt;

&lt;p&gt;To, že se v současné době setkáváme s „lidštějšími URL“ (&lt;em&gt;pretty URL&lt;/em&gt; nebo &lt;em&gt;user-friendly URL&lt;/em&gt;), je v určité míře způsobeno masivní evangelizací odborníků na použitelnost, daleko více však důležitostí, kterou na současném webu hraje &lt;strong&gt;optimalizace pro vyhledavače&lt;/strong&gt;. I programátoři si uvědomili (nebo je k tomu někdo donutil), že pokud „nejste na Googlu“, váš web jakoby nebyl, a téměř všechny &lt;em&gt;content management systems&lt;/em&gt; se dnes chlubí tím, že generují „SEO-friendly URL“.&lt;/p&gt;

&lt;p&gt;Při tvorbě správného URL je třeba dodržet minimálně dva základní principy: &lt;strong&gt;odhadnutelnost&lt;/strong&gt; a &lt;strong&gt;reprodukovatelnost&lt;/strong&gt;. To znamená, že běžný návštěvník ze samotného URL odhadne, co za obsah jej asi na dané adrese čeká („výpis článků nebo detail článku?“) a že URL vrací stále tentýž dokument (např. pokud URL někomu pošlu e-mailem), a obsahuje úplné informace k jeho zobrazení (proměnná &lt;code&gt;lang&lt;/code&gt; tedy např. není uložena v &lt;em&gt;cookie&lt;/em&gt; nebo &lt;em&gt;session&lt;/em&gt;). &lt;span class=&quot;note&quot;&gt;(Existují samozřejmě výjimky, jako je adresa &lt;code&gt;http://blog.example.com/latest-posts&lt;/code&gt; nebo &lt;code&gt;http://blog.example.com/posts-since-your-last-visit&lt;/code&gt;. Zvláště v kontextu blogů se podobné problémy řeší tzv. &lt;em&gt;permalinky&lt;/em&gt;, odkazy na komentáře ve tvaru &lt;code&gt;http://blog…/#comment-45&lt;/code&gt;, apod.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Řekli jsme, že typickým požadavkem zvenčí u webové aplikace je URL. Takové URL může v (téměř) ideálním tvaru vypadat např. takto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://www.example.com/article/show/1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Je zjevné, že toto URL velmi pravděpodobně zobrazí (&lt;em&gt;show&lt;/em&gt;) nějaký článek (&lt;em&gt;article&lt;/em&gt;) s identifikačním číslem 1 — je tedy velmi dobře odhadnutelné. To, co je zjevné člověku, ale &lt;strong&gt;stroje samy od sebe neví&lt;/strong&gt;. Aby to „věděly“, je třeba jim to „říci“. Jak tedy Rails říkají stroji, co a jak zobrazit?&lt;/p&gt;

&lt;p&gt;Direktivy, které &lt;em&gt;routing&lt;/em&gt; řídí, jsou v Rails obsaženy v souboru &lt;code&gt;config/routes.rb&lt;/code&gt;. Nepřekvapí nás, když tam najdeme tuto direktivu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.connect ':controller/:action/:id'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rails vycházejí v této &lt;em&gt;základní route&lt;/em&gt; z jednoduchého principu: první entita, na kterou v URL narazíme, je zároveň první dělící čárou aplikace v MVC architektuře — &lt;strong&gt;který &lt;em&gt;controller&lt;/em&gt;&lt;/strong&gt; převezme požadavek? Druhá entita je další dělící čárou — &lt;strong&gt;která metoda&lt;/strong&gt; (akce) tohoto &lt;em&gt;controlleru&lt;/em&gt; převezme požadavek? A konečně, této metodě je třeba předat nějaké &lt;strong&gt;parametry&lt;/strong&gt; (např. ID stránky, způsob řazení výpisu, apod.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;90% všech &lt;em&gt;routes&lt;/em&gt; v typické webové aplikaci je tvořeno právě takto&lt;/strong&gt;: zavolej určitou &lt;em&gt;metodu&lt;/em&gt; nějakého &lt;em&gt;controlleru&lt;/em&gt; a předej jí nějaký &lt;em&gt;identifikátor&lt;/em&gt; nebo jiný parametr. Rails obsahují tuto direktivu již v čisté instalaci a není třeba ji stroji zvlášť sdělovat. V typické aplikaci si s touto direktivou vystačíte a další ani nebudete muset přidávat.&lt;/p&gt;

&lt;p&gt;Stačí tedy, když dodržíte tuto strukturu URL, a vaše aplikace bude &lt;strong&gt;„sama od sebe vědět“&lt;/strong&gt;, co si má s požadavkem počít. Tento typický scénář ilustruje následující schéma:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/7/1/Rails-Routing.png&quot; alt=&quot;Schéma směrování (routing) v Ruby on Rails&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Protože &lt;em&gt;routes&lt;/em&gt; je samozřejmě třeba stejně snadno číst jako vypisovat (typicky ve &lt;em&gt;view&lt;/em&gt;), Rails obsahují pohodlné a &lt;strong&gt;čitelné&lt;/strong&gt; generátory &lt;em&gt;routes&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;%= link_to &quot;Celý článek&quot;, :controller =&amp;gt; 'article', :action =&amp;gt; 'show', :id =&amp;gt; article.id %&amp;gt;
=&amp;gt; &amp;lt;a href=&quot;/article/display/1&quot;&amp;gt;Celý článek&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Routing v Rails je samozřejmě velmi sofistikovaný (a odstiňuje vývojáře od direktiv pro &lt;code&gt;mod_rewrite&lt;/code&gt; podobně, jako &lt;em&gt;ActiveRecord&lt;/em&gt; od SQL). Nyní zmíníme jen jeden velmi poutavý koncept: koncept &lt;strong&gt;pojmenovaných &lt;em&gt;routes&lt;/em&gt;&lt;/strong&gt;, kdy určité pravidlo není „anonymní“, jako v našem příkladě výše, ale má svůj identifikátor, pomocí něhož se pak na pravidlo můžeme odkazovat. Místo uvedeného příkladu stačí použít jiný výraz než &lt;code&gt;connect&lt;/code&gt; a nakonfigurovat pravidlo o něco složitěji:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.show_article 'article/show/:id',
                                    :controller =&amp;gt; 'article',
                                    :action     =&amp;gt; 'show',
                                    :id         =&amp;gt; /\d+/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Překlad: toto pravidlo zachytí URL, které začíná výrazem &lt;code&gt;article/show&lt;/code&gt;, který následuje číslo (onen &lt;a href=&quot;http://www.regexp.cz/&quot;&gt;regulární výraz&lt;/a&gt; &lt;code&gt;\d+&lt;/code&gt;, tedy &lt;em&gt;alespoň jedno číslo&lt;/em&gt;). Kromě větší flexibility a případně i přehlednosti routovacích pravidel mají pojmenované &lt;em&gt;routes&lt;/em&gt; jednu velkou výhodu: lze je volat ve &lt;em&gt;views&lt;/em&gt;, takže místo relativně komplikovaného kódu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;%= link_to &quot;Celý článek&quot;, :controller =&amp;gt; 'article', :action =&amp;gt; 'show', :id =&amp;gt; article.id %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;můžeme napsat velmi &lt;strong&gt;čitelně&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;%= link_to &quot;Celý článek&quot;, show_article_url(:id =&amp;gt; article.id) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Koncept pojmenovaných routes krásně ilustruje eleganci Rails. Transparentní &lt;em&gt;routing&lt;/em&gt;, který člověka zbaví nutnosti konfigurovat a ladit nevyzpytatelný &lt;code&gt;mod_rewrite&lt;/code&gt; je balzám na nervy vývojáře. Ale pojmenované &lt;em&gt;routes&lt;/em&gt;, které umožní celý seznam pravidel zpřehlednit a učinit čitelný, a navíc je lze využít v Rails pro &lt;strong&gt;ušetření psaní dalšího kódu&lt;/strong&gt;, to už je téměř živá voda. &lt;strong&gt;„Méně kódu!“&lt;/strong&gt; (&lt;em&gt;less code!&lt;/em&gt;) je základní mantra vývoje v Rails, která úzce souvisí s filosofií &lt;strong&gt;„Nepiš to dvakrát!“&lt;/strong&gt; (&lt;em&gt;„Don't repeat yourself!“&lt;/em&gt; neboli &lt;a href=&quot;http://www.majda.cz/vyuka/2006-2007/swi113/slajdy.html#slide-113&quot;&gt;&lt;em&gt;DRY&lt;/em&gt;&lt;/a&gt;) — tedy že vše by mělo být deklarováno jen &lt;strong&gt;jednou&lt;/strong&gt; a na &lt;strong&gt;jednom&lt;/strong&gt; místě.&lt;/p&gt;

&lt;h2&gt;Propojení controller &amp;harr; view&lt;/h2&gt;

&lt;p&gt;Dosud jsme si ukázali, jak Rails řeší práci s daty v databázi a jak prostřednictvím &lt;em&gt;routingu&lt;/em&gt; vědí, kterou část kódu mají vykonat při jakém požadavku. Jak ale Rails vědí, který &lt;em&gt;view&lt;/em&gt; je třeba kdy zobrazit, a jak si data mezi jednotlivými komponentami předávají? Jak je vlastně uspořádána ta část aplikace, která řeší zobrazení uživateli?&lt;/p&gt;

&lt;p&gt;Právě &lt;strong&gt;propojení mezi logikou aplikace a výstupem v HTML stránce&lt;/strong&gt; je jednou z nejbolestivějších oblastí vývoje pro web. Diskuse o „správném“ přístupu k šablonám (tedy prezentační vrstvě aplikace) jsou jedny z nejžhavějších, a v kontextu webového vývoje se stále dokola rozebírá, zda může šablona obsahovat interpretovatelný kód, co tento kód „smí“ a „nesmí“, co je „srozumitelnější“ pro web designéry (takže vznikají „šablonovací systémy vytvořené pomocí šablonovacích systémů“) a podobně. Pro všechny možné jazyky existuje nespočet šablonovacích systémů s různou mírou striktnosti, čistoty a komplexity. Šablony jsou umisťovány ve složkách s různými názvy, různými příponami, a vztah mezi šablonami a controllery je začasté přinejmenším neodhadnutelný.&lt;/p&gt;

&lt;p&gt;Jednoduchá definice „šablony“ v kontextu webové aplikace praví, že se jedná o HTML kód s „dírami“, do nichž se leje dynamický obsah, poskytovaný aplikací, tedy ono typické &lt;code&gt;&amp;lt;p&amp;gt;Ahoj, {NAME}&amp;lt;/p&amp;gt;&lt;/code&gt;, kde &lt;code&gt;{NAME}&lt;/code&gt; je nahrazeno za &lt;code&gt;Honzo&lt;/code&gt;. Koncept šablony ovšem přestává být takto prostý, jakmile začneme řešit výpisy v cyklu, střídání barev pozadí řádků tabulky, zobrazení obsahu pouze určitému uživateli, a jinou složitější logiku, které se v promyšlenější aplikaci nevyhneme.&lt;/p&gt;

&lt;p&gt;Klasický &lt;a href=&quot;http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf&quot;&gt;akademický přístup&lt;/a&gt; reprezentuje např. &lt;a href=&quot;http://www.stringtemplate.org&quot;&gt;&lt;strong&gt;StringTemplate&lt;/strong&gt;&lt;/a&gt; Terence Parra, který rozhodně stojí za pozornost, zajímá-li vás problematika šablonovacích systémů hlouběji. (Děkuji Jiřímu Gruntovi za jeho připomenutí.) &lt;em&gt;StringTemplate&lt;/em&gt; se (úspěšně) snaží o naprosté oddělení logiky aplikace od &lt;em&gt;view&lt;/em&gt; a jedná se o velmi robustní koncept. Mementem pro všechny koncepty šablonovacích systémů je vyjádření &lt;a href=&quot;http://www.stringtemplate.org/about.html&quot;&gt;Terence Parra&lt;/a&gt;: „Vypadá-li vaše šablona jako program, pak to asi bude program — podařilo se vám dokonale zamotat &lt;em&gt;model&lt;/em&gt; a &lt;em&gt;view&lt;/em&gt; dohromady“. A takové „zamotání“ je pro skutečnou &lt;em&gt;Model-View-Controller&lt;/em&gt; architekturu nepřípustné.&lt;/p&gt;

&lt;p&gt;Rails tento oříšek řeší velmi pragmaticky a dle dikta Davida Heinemeiera Hanssona, že správné techniky by měl nástroj &lt;strong&gt;podporovat&lt;/strong&gt;, resp. k nim &lt;strong&gt;ponoukat&lt;/strong&gt;, nikoliv je od vývojáře &lt;strong&gt;vyžadovat&lt;/strong&gt;. Rails nepoužívají žádný „šablonovací jazyk“ (&lt;em&gt;template language&lt;/em&gt;), HTML šablony Rails (&lt;em&gt;.rhtml&lt;/em&gt; soubory ve složce &lt;code&gt;app/views&lt;/code&gt;) obsahují &lt;strong&gt;„úplně normální“ Ruby kód&lt;/strong&gt;, tzv. &lt;a href=&quot;http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html&quot;&gt;&lt;em&gt;ERB&lt;/em&gt;&lt;/a&gt; neboli &lt;em&gt;Embedded Ruby&lt;/em&gt;. &lt;strong&gt;Nevymýšlejí&lt;/strong&gt; a nepoužívají tedy nějaké „jiné &lt;em&gt;if&lt;/em&gt;“ nebo „jiný &lt;em&gt;foreach&lt;/em&gt;“ (jak mají autoři šablonovacích systémů &lt;em&gt;velice&lt;/em&gt; v oblibě), ale „úplně normální“ Ruby příkazy &lt;em&gt;if … end&lt;/em&gt;, &lt;em&gt;each … end&lt;/em&gt;, atd.&lt;/p&gt;

&lt;p&gt;Na koncepci &lt;em&gt;view&lt;/em&gt; v Rails je velmi sympatická maximální jednoduchost a vynalézavé uplatnění pravidla „konvence má přednost před konfigurací“. Mnohé nám díky znalosti &lt;em&gt;routingu&lt;/em&gt; bude ihned srozumitelné.&lt;/p&gt;

&lt;p&gt;Rails rozlišují obecnou šablonu celé aplikace nebo její části (typicky &lt;em&gt;controlleru&lt;/em&gt;): &lt;strong&gt;&lt;em&gt;layout&lt;/em&gt;&lt;/strong&gt;, od šablon pro konkrétní výstupy (typicky metody &lt;em&gt;controlleru&lt;/em&gt;): &lt;strong&gt;&lt;em&gt;template&lt;/em&gt;&lt;/strong&gt;. &lt;em&gt;Layout&lt;/em&gt; obsahuje obecnou „skořápku“ aplikace — sekci &amp;lt;head&amp;gt;, záhlaví, zápatí — a &lt;em&gt;template&lt;/em&gt; pak „maso“ stránky. Pokud Rails najdou ve složce &lt;code&gt;app/views/layouts/&lt;/code&gt; soubor &lt;code&gt;application.rhtml&lt;/code&gt;, použijí jej automaticky jako obecný layout pro všechny &lt;em&gt;controllery&lt;/em&gt; — dokud nenaleznou jinou &lt;em&gt;konvenci&lt;/em&gt; nebo &lt;em&gt;konfiguraci&lt;/em&gt;. Tohoto faktu můžeme skvěle využít, a speciální HTML layout vytvářet jen pro určité &lt;em&gt;controllery&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Vyjdeme z toho, že máme &lt;em&gt;controller&lt;/em&gt; nazvaný &lt;em&gt;Article&lt;/em&gt; (viz &lt;code&gt;app/controllers/article_controller.rb&lt;/code&gt;), s metodami &lt;code&gt;index&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt; a &lt;code&gt;show&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ArticleController &amp;lt; ApplicationController

  def index
        # logika metody...
  end

  def list
        # logika metody...
  end

  def show
        # logika metody...
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Chceme mít pro tento &lt;em&gt;controller&lt;/em&gt; zvláštní layout, odlišný od obecného v &lt;code&gt;application.rhtml&lt;/code&gt;. Rails pro tento controller automaticky použijí layout ze souboru &lt;strong&gt;&lt;code&gt;article.rhtml&lt;/code&gt;&lt;/strong&gt;, pokud takový soubor ve složce &lt;code&gt;app/views/layouts&lt;/code&gt; naleznou. To je &lt;em&gt;konvence&lt;/em&gt;, kterou je velmi dobré v Rails dodržovat — kromě toho, že si (opět!) ušetříme spoustu psaní, struktura aplikace bude zas o něco &lt;strong&gt;srozumitelnější&lt;/strong&gt; (nejenom vám, ale i někomu jinému, a to dle známého pravidla znamená i „vám po 2 letech“). Controller &lt;em&gt;Page&lt;/em&gt; tedy používá layout &lt;code&gt;page.rhtml&lt;/code&gt;, controller &lt;em&gt;User&lt;/em&gt; layout &lt;code&gt;user.rhtml&lt;/code&gt;, a tak dále. Nám pak stačí pouze tyto soubory vytvořit ve složce &lt;code&gt;app/views/layouts&lt;/code&gt;, naplnit HTML, a Rails se postarají o ostatní.&lt;/p&gt;

&lt;p&gt;Samozřejmě můžeme pro určitý &lt;em&gt;controller&lt;/em&gt; použít i zcela jiný layout — jako téměř vše v Rails, je to otázka jednoduché konfigurace:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ArticleController &amp;lt; ApplicationController
    layout &quot;clanek&quot;
    # zbytek logiky controlleru...
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rails pak budou layout pro &lt;em&gt;controller&lt;/em&gt; &lt;em&gt;Article&lt;/em&gt; hledat v souboru &lt;code&gt;app/views/layouts/clanek.rhtml&lt;/code&gt;. Ba co víc! Layout můžeme klidně deklarovat dynamicky, podle stavu aplikace, typu požadavku nebo třeba (nesmyslně) IP adresy, z níž přichází HTTP požadavek (příklad je převzat z knihy &lt;em&gt;Agile Web Development With Rails&lt;/em&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class StoreController &amp;lt; ApplicationController

    layout :determine_layout

    private

    def determine_layout
        if Store.is_closed?
            &quot;store_closed&quot;
        else
            &quot;standard&quot;
        end
    end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podle toho, jakou hodnotu vrátí metoda &lt;code&gt;Store.is_closed?&lt;/code&gt; &lt;span class=&quot;note&quot;&gt;(opět si povšimněte skvělého použití otazníku v Ruby, je zcela &lt;strong&gt;jasné&lt;/strong&gt;, že metoda vrací booleovskou hodnotu)&lt;/span&gt; se použije layout &lt;code&gt;store_closed&lt;/code&gt; nebo &lt;code&gt;standard&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Náš controller &lt;em&gt;Article&lt;/em&gt;, jak vidíme, má tři &lt;em&gt;metody&lt;/em&gt;: &lt;code&gt;index&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt; a &lt;code&gt;show&lt;/code&gt;. Poslední dvě budou (nepřekvapivě) vypisovat seznam článků a zobrazovat konkrétní článek. Metoda &lt;code&gt;index&lt;/code&gt; je specialita Rails: je volána, pokud voláme v URL samotný controller bez nějaké metody/akce — tedy např. &lt;code&gt;http://example.com/article&lt;/code&gt;. &lt;span class=&quot;note&quot;&gt;(Povšimněte si, jak je elegantně nazvána podle názvu implicitně načítaného souboru na webovém serveru: index.html)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Šablony pro tyto metody jsou pak (nepřekvapivě) uloženy ve složce &lt;code&gt;article&lt;/code&gt; ve složce &lt;code&gt;app/views&lt;/code&gt;. Každé metodě pak odpovídá &lt;em&gt;.rhtml&lt;/em&gt; soubor: &lt;code&gt;index.rhtml&lt;/code&gt;, &lt;code&gt;list.rhtml&lt;/code&gt; a &lt;code&gt;show.rhtml&lt;/code&gt; — název souboru je tedy shodný s názvem metody. Není třeba nějak &lt;em&gt;výslovně&lt;/em&gt; zobrazení toho &lt;em&gt;view&lt;/em&gt; „volat“ nebo „konfigurovat“, aplikace provede kód metody a zobrazí šablonu. &lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Pro metody mohou též existovat šablony pro zobrazování jiného typu obsahu, např. &lt;em&gt;XML&lt;/em&gt; (&lt;code&gt;.rxml&lt;/code&gt;) nebo specificky pro Rails &lt;em&gt;Javascriptu&lt;/em&gt; (&lt;code&gt;.rjs&lt;/code&gt;), které se využívají zvláště pro práci s Ajaxem — metody controlleru mohou vracet jiný typ obsahu (klidně i obrázkový graf místo HTML tabulky) podle typu požadavku. K tomu se ještě vrátíme v některém z příštích článků o Ajaxu.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Struktura prezentační vrstvy aplikace je pak zobrazena na obrázku níže. &lt;span class=&quot;note&quot;&gt;(Tuto demonstrační miniaplikaci si můžete &lt;a href=&quot;/assets/2007/7/2/views_example.zip&quot;&gt;stáhnout&lt;/a&gt; &lt;em&gt;(ZIP, 80KB)&lt;/em&gt;, pokud si chcete propojení controlleru, jeho metod a &lt;em&gt;views&lt;/em&gt; vyzkoušet sami.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/7/1/rails_views_directory_list.png&quot; alt=&quot;Views v Ruby on Rails&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vidíme, že díky jednoduché korespondenci: &lt;em&gt;název controlleru = název layoutu&lt;/em&gt; a &lt;em&gt;název metody&lt;/em&gt; = &lt;em&gt;název šablony&lt;/em&gt; nám Rails (jako obvykle) šetří nejenom &lt;strong&gt;psaní kódu&lt;/strong&gt;, ale především vymýšlení a konfigurování těchto vztahů. Právě tyto &lt;em&gt;chytré&lt;/em&gt; vlastnosti Rails způsobují, že při psaní kódu máte pocit, že vám „počítač rozumí“, že programování nemusí být útrpná dřina a snaha přimět počítat vykonávat nějaké „příkazy“. Aplikace funguje jakoby „sama od sebe“ — stačí respektovat jednoduchá a velice přirozená pravidla: název metody je stejný jako název šablony, název &lt;em&gt;controlleru&lt;/em&gt; je stejný jako název layoutu.&lt;/p&gt;

&lt;p&gt;Pro určitou metodu však můžeme &lt;em&gt;velmi triviálně&lt;/em&gt; použít zcela jiný layout:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def show
    # logika metody...
    render(:template =&amp;gt; 'zobraz')
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;a to &lt;strong&gt;buď k dobru nebo ke škodě&lt;/strong&gt; naší aplikace. &lt;/p&gt;

&lt;p&gt;Dosavadní — snad až příliš rozsáhlý — exkurz měl sloužit k ilustraci &lt;em&gt;nejvýraznější vlastnosti Ruby on Rails&lt;/em&gt;: &lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;&lt;strong&gt;Rails obsahují téměř nejucelenější soubor &lt;em&gt;best practices&lt;/em&gt; pro webový vývoj a design.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jednoduchá, pragmatická a přitom maximálně promyšlená pravidla pro vztahy mezi controllery, jejich metodami a šablonami mají charakter &lt;a href=&quot;http://en.wikipedia.org/wiki/Image:Platinum-Iridium_meter_bar.jpg&quot;&gt;„platinového standardu“&lt;/a&gt;. Těžko lze vymyslet něco &lt;em&gt;chytřejšího&lt;/em&gt; při zachování stejné míry obecnosti &lt;em&gt;a zároveň&lt;/em&gt; jednoduchosti. Téměř ve všech ostatních aspektech (např. hned za okamžik při výkladu o &lt;em&gt;Embedded Ruby&lt;/em&gt; v HTML) potkáme v Rails identický přístup: zde je určitá „doporučená technika“, &lt;em&gt;best practice&lt;/em&gt;, a je jen na vás, zda-li jejího intelektuálního přínosu využijete či budete vymýšlet „vlastní cesty“. Téměř vše lze v Rails ohnout, znásilnit, udělat „jinak“. &lt;/p&gt;

&lt;p&gt;Ke správným technikám vás Rails, podobně jako Ruby, nenutí, &lt;strong&gt;jen&lt;/strong&gt; je doporučují. Klasické vyjádření Yukihira Matsumota zní: &lt;cite&gt;&lt;strong&gt;„Globální proměnné začínají znakem dolaru. To vypadá dost ošklivě, takže vás to odrazuje od jejich používání“&lt;/strong&gt; (&lt;em&gt;&lt;a href=&quot;http://www.itconversations.com/shows/detail1638.html&quot;&gt;Přednáška „The Power of Ruby“&lt;/a&gt;)&lt;/em&gt;&lt;/cite&gt;. Je to &lt;strong&gt;ošklivé&lt;/strong&gt;, takže by se to tak &lt;strong&gt;nemělo&lt;/strong&gt; dělat… máloco shrnuje filosofii Ruby tak výstižně. Právě z těchto pozic vycházel David Heinemeier Hansson, když Rails navrhoval.&lt;/p&gt;

&lt;blockquote cite=&quot;&quot;&gt;
„Pohleďme na vývojáře. Po jeho levici stojí ďábel, po jeho pravici anděl. (…) V určitých situacích a za určitých podmínek je ďábel mocnější než anděl. (…) Ďábel praví například: ó, na tom nezáleží — tohle můžeš vždycky vylepšit později, k tomu se můžeš vždycky vrátit, nezáleží na tom, zda Petr ví, jak tohle funguje, ty víš, jak tenhle algoritmus funguje, a to z tebe dělá cenného zaměstnance. (…) Snažíme se ze všech sil, abychom do Rails vtělili anděla. [Vezměte si například] tyto konvence. Snažíme se, aby pro vás v Rails bylo jednodušší dělat věci správně a čistě než &lt;em&gt;hackovat&lt;/em&gt;. Musíte se dost snažit, aby se vám povedlo udělat něco ošklivého. Musíte hrubě porušit nějakou konvenci a přidat nějakou konfiguraci, abyste vytvořili něco nekonzistentního. (…) Všude v Rails se snažíme klást tyto „pozvánky“, jak dělat věci lépe.“
&lt;p class=&quot;author&quot;&gt;&lt;span class=&quot;tilde&quot;&gt;~&lt;/span&gt; David Heinemeier Hansson: &lt;a href=&quot;http://www.webuser.co.uk/carsonworkshops/DavidHeinemeierHansson.mp3&quot; title=&quot;Audio MP3, 12MB&quot;&gt;Happy Programming and Sustainable Productivity with Ruby on Rails&lt;/a&gt;&lt;span class=&quot;source&quot;&gt;, přednáška na konferenci &lt;em&gt;Future Of Web Applications&lt;/em&gt;, únor 2006&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O vztahu mezi &lt;em&gt;controllery&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt; tedy již víme hodně z koncepčního i praktického pohledu. Vynikající instruktáž o &lt;em&gt;views&lt;/em&gt; v angličtině naleznete mj. v epizodě &lt;a href=&quot;http://railscasts.com/episodes/7&quot;&gt;&lt;em&gt;„All about layouts“&lt;/em&gt;&lt;/a&gt; na &lt;em&gt;Railscasts&lt;/em&gt;, kde Ryan Bates pravidelně publikuje &lt;em&gt;screencasty&lt;/em&gt; o Rails.&lt;/p&gt;

&lt;p&gt;Jak ale Rails &lt;strong&gt;předávají data do &lt;em&gt;views&lt;/em&gt;&lt;/strong&gt;? K tomu jsme se ještě nedostali. Je to opět velmi prosté: proměnné, které &lt;em&gt;controller&lt;/em&gt; nastaví, jsou přístupné ve &lt;em&gt;view&lt;/em&gt;. Představme si typický scénář, kdy chceme mít ve &lt;em&gt;view&lt;/em&gt; dostupný objekt, obsahující data o článku s ID &lt;em&gt;1&lt;/em&gt;. (Tomu odpovídá URL ve známém tvaru: &lt;code&gt;http://www.example.com/article/show/1&lt;/code&gt;.) Pomocí &lt;em&gt;ActiveRecord&lt;/em&gt; data přečteme z databáze a uložíme do proměnné &lt;code&gt;@article&lt;/code&gt;. &lt;span class=&quot;note&quot;&gt;(Zavináč před názvem proměnné znamená, že proměnná bude platit pro celou &lt;em&gt;instanci&lt;/em&gt; controlleru a bude dostupná i ve &lt;em&gt;view&lt;/em&gt;. Pokud bychom proměnnou nazvali &lt;code&gt;article&lt;/code&gt; (bez zavináče), platila by pouze v rozsahu metody &lt;code&gt;show&lt;/code&gt; — tedy jako lokální proměnná. O proměnných v Ruby si povíme více v některém z dalších článků.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;V &lt;em&gt;controlleru&lt;/em&gt; tedy napíšeme:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# app/views/controllers/article_controller.rb
class ArticleController &amp;lt; ApplicationController

  def show
        @article = Article.find(params[:id])
  end

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ve &lt;em&gt;view&lt;/em&gt; pak proměnnou &lt;code&gt;@article&lt;/code&gt; můžeme jednoduše použít:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# app/views/article/show.rhtml
&amp;lt;h1&amp;gt;&amp;lt;%= @article.title %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;%= @article.body %&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;hr /&amp;gt;
&amp;lt;p&amp;gt;Publikováno dne: &amp;lt;%= @article.published_at %&amp;gt;&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Výraz &lt;code&gt;&amp;lt;%=&lt;/code&gt; otevírá onu zmíněnou „díru“ v HTML, kam prostřednictvím &lt;em&gt;Embedded Ruby&lt;/em&gt; vypisujeme dynamický obsah (např. název článku: &lt;code&gt;@article.title&lt;/code&gt;). V určité analogii odpovídá výrazu &lt;code&gt;&amp;lt;?=&lt;/code&gt; v PHP. Pokud chceme v šabloně použít jinou logiku než prostý výpis proměnné do stránky, např. ověřit nějakou hodnotu pomocí &lt;code&gt;if&lt;/code&gt;, použijeme podobný výraz bez rovnítka:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;% if @user.is_admin? %&amp;gt;
    &amp;lt;h2&amp;gt;Statistické informace o aplikaci:&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;Přihlášených uživatelů: &amp;lt;%= @application.logged_users_count %&amp;gt;&amp;lt;/p&amp;gt;
    ...
&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tento přístup samozřejmě v jistém smyslu otevírá &lt;em&gt;Pandořinu skříňku&lt;/em&gt; pro HTML prošpikované nekonečnými &lt;code&gt;if … else&lt;/code&gt; sekvencemi, pro &lt;strong&gt;příliš logiky&lt;/strong&gt; v šabloně. Rails jsou v tomto smyslu jednak nesmiřitelně pragmatické, jednak správné techniky doporučují, nikoliv vnucují, jak jsme probírali výše. Použití &lt;em&gt;Embedded Ruby&lt;/em&gt; dává šablonám velkou moc — je na intuici a uvážení vývojáře, zda bude do šablony vkládat nepřehledné kusy logiky a jiné &lt;em&gt;hacky&lt;/em&gt; či nikoliv. &lt;span class=&quot;note&quot;&gt;Čistě teoreticky lze tedy v HTML šabloně Rails napsat &lt;strong&gt;jakýkoliv&lt;/strong&gt; Ruby kód, includovat knihovny, připojit se k databázi, a podobně.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;V kontextu Rails je však takové nebezpečí relativně malé. Díky úspornosti a expresivitě Ruby každý nepřehledný kus kódu trčí ze šablony ven „jako šídlo z pytle“. Správné postupy, kterým se lze učit nejenom z ustrojení Rails samotných, ale i z &lt;a href=&quot;http://forum.rubyonrails.cz/forums/1/topics/4&quot;&gt;ukázkových Rails aplikací&lt;/a&gt;, vás na dobré cestě vedou.&lt;/p&gt;

&lt;p&gt;Podstatnější z praktického pohledu ale je, že Rails obsahují mnoho nástrojů pro to, že k &lt;em&gt;hackování&lt;/em&gt; ve špatném slova smyslu nikdy ani nedojdeme. Jedním z těchto nástrojů jsou &lt;a href=&quot;http://rails.rubyonrails.com/classes/ActionView/Partials.html&quot;&gt;&lt;em&gt;parciální šablony&lt;/em&gt;&lt;/a&gt; (&lt;em&gt;partial templates&lt;/em&gt;), o nichž si povíme v některém článku, zabývajícím se Ajaxem. Daleko silnějším nástrojem je koncepce &lt;em&gt;helperů&lt;/em&gt;, pomocných metod, do nichž se přesunuje logika z &lt;em&gt;view&lt;/em&gt;. Rails obsahují mnohé &lt;em&gt;helpery&lt;/em&gt; zabudované a disponují velmi transparentním mechanismem, jak si tvořit vlastní. O &lt;em&gt;helperech&lt;/em&gt; si povíme hned v příštím článku, společně s výkladem o &lt;em&gt;generátorech&lt;/em&gt; a &lt;em&gt;konzoli&lt;/em&gt;, neocenitelných pomocnících při každodenním vývoji. Naše úvodní série článků skončí výkladem o &lt;em&gt;pluginech&lt;/em&gt; pro Rails, tedy o práci energické komunity vývojářů, která nám může vlastní vývoj usnadnit a naše přemýšlení o webových aplikacích třeba nasměrovat na úplně jinou cestu…&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Velké poděkování patří Vítku Burdovi za nepolevující kritický zrak, nezkalený „dobrým srdcem“ =)&lt;/span&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-06-28:77</id>
    <published>2007-06-28T10:31:00+00:00</published>
    <updated>2007-06-28T10:36:44+00:00</updated>
    <category term="Rails"/>
    <link href="http://blog.karmi.cz/2007/6/28/railscamp" rel="alternate" type="text/html"/>
    <title>Setk&#225;n&#237; v Praze</title>
<summary type="html">&lt;p&gt;Přijďte na setkání spřízněných duší okolo Ruby a Ruby on Rails na Letnou!&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Přijďte na setkání spřízněných duší okolo Ruby a Ruby on Rails na Letnou!&lt;/p&gt;
&lt;p&gt;Jiří Kubíček z &lt;a href=&quot;http://www.railshosting.cz&quot;&gt;Railshosting.cz&lt;/a&gt; pořádá příští středu setkání zájemců o Ruby a Ruby on Rails v Praze na Letné. Pokud si plánujete příští týden, tak si středu 4. 7. 19:00 rezervujte. Já i mí kolegové rozhodně jdeme, takže přijďte, ať si můžeme o všem popovídat naživo a potkáte Ruby/Rails spřízněné duše.&lt;/p&gt;

&lt;p&gt;Aktuální informace naleznete na &lt;strong&gt;&lt;a href=&quot;http://forum.rubyonrails.cz/forums/1/topics/2&quot;&gt;forum.rubyonrails.cz&lt;/a&gt;&lt;/strong&gt;. Tamtéž &lt;strong&gt;potvrzujte svou účast&lt;/strong&gt;, ať může Jiří provést rezervaci příhodného lokálu!&lt;/p&gt;

&lt;p&gt;Mám připravený další článek (dokončení úvodu), který by měl vyjít někdy v průběhu víkendu. Hned poté se můžete těšit na oznámený článek o Rails z pohledu projektového manažera, který mi přihrál Martin Michálek na blogu &lt;a href=&quot;http://www.vzhurudolu.cz/72/ruby-on-rails-pochybnosti-opatrneho-vedouciho-projektu&quot;&gt;Vzhůru dolů&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jak vidíte na obrázku níže, těch, které Rails zajímají, začíná být relativně dost i v Čechách! Díky všem za odkazy, za povzbudivé komentáře a e-maily!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/6/28/blog.karmi.cz.visits.png&quot; alt=&quot;Návštěvnost blog.karmi.cz v červnu 2007&quot; /&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-06-16:36</id>
    <published>2007-06-16T23:00:00+00:00</published>
    <updated>2007-07-07T12:05:56+00:00</updated>
    <category term="Rails"/>
    <link href="http://blog.karmi.cz/2007/6/16/co-je-ruby-on-rails-cast-2" rel="alternate" type="text/html"/>
    <title>Ruby on Rails a revoluce ve v&#253;voji pro web. &#268;&#225;st druh&#225;: Active Record</title>
<summary type="html">&lt;p&gt;V prvním článku o Ruby on Rails jsme si osvětlili principy, na nichž je založen jazyk Ruby, základ celého frameworku. V tomto článku se budeme zabývat základními východisky Rails a elementu, který je nejlépe dokládá: abstraktní vrstvě Active Record.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;V prvním článku o Ruby on Rails jsme si osvětlili principy, na nichž je založen jazyk Ruby, základ celého frameworku. V tomto článku se budeme zabývat základními východisky Rails a elementu, který je nejlépe dokládá: abstraktní vrstvě Active Record.&lt;/p&gt;
&lt;p&gt;V &lt;a href=&quot;/co-je-ruby-on-rails-cast-1&quot;&gt;prvním článku&lt;/a&gt; o Ruby on Rails jsme se zabývali základními filosofickými principy, na nichž je založen jazyk Ruby — jazyk, v němž jsou Rails napsány a v němž jsou psány Rails aplikace. Viděli jsme, že jeho úsporná syntaxe je navržena tak, aby se programátorovi &lt;strong&gt;nepletla do cesty&lt;/strong&gt;, a umožnila mu co nejsnazší a nejelegantnější vyjádření „myšlenky“:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;5.times { print &quot;Hurá! &quot; }
=&amp;gt; ‚Hurá! Hurá! Hurá! Hurá! Hurá!‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;V tomto článku bych se chtěl věnovat tomu, co dělá Rails tím, čím jsou. Jestliže nevíte o Rails nic nebo téměř nic, než budete číst dál, podívejte se na patnáctiminutové video v angličtině, kde autor naprogramuje kompletní blog: &lt;a href=&quot;http://media.rubyonrails.org/video/rails_take2_with_sound.mov&quot; title=&quot;Video QuickTime, 52MB, 15min&quot;&gt;Creating a weblog in 15 minutes&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;… hotovo? Tak můžeme jít dál. Video je samozřejmě působivé a jsou v něm jasně vidět inspirační zdroje v Ruby. Asi je vám jasnější, proč Computerworld zařadil Rails mezi &lt;a href=&quot;http://computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9011969#rails&quot; title=&quot;The Top Five Technologies You Need to Know About in '07&quot;&gt;pět nejvýznamnějších technologií pro rok 2007&lt;/a&gt;. Napsat funkční aplikaci v čistém kódu a s použitím transparentních abstraktních vrstev za čtvrt hodiny je slušný výkon.&lt;/p&gt;

&lt;p&gt;Video také naznačuje odpověď na otázku, proč David Heinemeier Hansson (dále jen DHH) Ruby on Rails vytvořil: protože ho bavilo vidět výsledky své práce, ale nebavila ho práce samotná (&lt;a href=&quot;http://simon.incutio.com/notes/2006/summit/hansson.txt&quot;&gt;„Happy Programming with Ruby On Rails“&lt;/a&gt;). Takže po pěti letech vývoje různých aplikací v PHP vytvořil — víceméně jako „vedlejší produkt“ při práci na projektu &lt;a href=&quot;http://www.basecamphq.com/&quot;&gt;&lt;em&gt;Basecamp&lt;/em&gt;&lt;/a&gt; — framework Rails. (Pro nabízející se srovnání Ruby s PHP a celou diskusi „nechápu, proč jsi &lt;em&gt;Basecamp&lt;/em&gt; neudělal v PHP“ čtěte &lt;a href=&quot;http://www.37signals.com/svn/archives/000606.php&quot; title=&quot;Ruby on Rails to Basecamp (Signal vs. Noise)&quot;&gt;archivní diskusi na toto téma&lt;/a&gt;.) Oproti „běžné práci“ webového vývojáře vzniká výsledek v uvedeném videu snad jakoby sám od sebe, aplikace roste jako živý organismus.&lt;/p&gt;

&lt;p&gt;Proč je tomu tak? Protože autor nedělá a &lt;strong&gt;především nevymýšlí&lt;/strong&gt; žádné „nutné a nudné“ postupy: konfigurace, mapování URL, nepíše ani SQL dotazy. Všechny tyto základní věci se dějí jakoby „samy od sebe“. Autor se zabývá jen logikou aplikace samotné. Proč je tomu tak? Protože:&lt;/p&gt;

&lt;blockquote&gt;
„Toto je sněhová vločka. Vaše aplikace není jedna z nich. Většina věcí, které většina lidí dělá, není nijak unikátní. Vaše potřeby nejsou nijak ‚zvláštní‘.“
&lt;p class=&quot;author&quot;&gt;&lt;span class=&quot;tilde&quot;&gt;~&lt;/span&gt; David Heinemeier Hansson&lt;span class=&quot;source&quot;&gt;, přednáška na konferenci &lt;a href=&quot;http://www.webuser.co.uk/carsonworkshops/DavidHeinemeierHansson.mp3&quot; title=&quot;Audio MP3&quot;&gt;Future Of Web Applications, únor 2006&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Konvence má přednost před konfigurací&lt;/h2&gt;

&lt;p&gt;Nejste unikátní – to je naprosto &lt;strong&gt;klíčový princip designu Rails&lt;/strong&gt;: webové aplikace jsou si v podstatě podobné jako vejce vejci. Načítají data z databáze, transformují je do datových struktur programovacího jazyka (pole, hashe, objekty), provádějí s nimi manipulace (řazení, filtrování, transformace textů), vypisují je do HTML, a prostřednictvím formulářů je zase sbírají, provádějí s nimi manipulace a ukládájí je do relačních databází. Interaktivita aplikace je tvořena odkazy a formulářovými prvky, které načítají různá URL.&lt;/p&gt;

&lt;p&gt;Problém je v tom, že začínat psát běžnou webovou aplikaci v PHP od příkazu &lt;code&gt;mysql_connect&lt;/code&gt; a zabývat se dotazy do databáze typu &lt;code&gt;SELECT * FROM articles ORDER BY published_at&lt;/code&gt; je absurdně vyčerpávající a nevýhodné. Proto vstupuje na scénu záležitost zvaná &lt;em&gt;framework&lt;/em&gt;, byť by to byly jen dvě třídy na abstrakci připojení k databázi a na generování formulářů. &lt;em&gt;Enterprise&lt;/em&gt; řešení s sebou zase většinou přinášejí takovou zátěž konfigurace, nastavování, provázání technologií nebo závislosti na platformě, že je v běžném provozu používají jen specifické projekty.&lt;/p&gt;

&lt;p&gt;Proto se DHH rozhodnul ctít hlavní pravidlo: &lt;strong&gt;konvence má přednost před konfigurací&lt;/strong&gt;. V určité analogii s &lt;a href=&quot;http://en.wikipedia.org/wiki/Pareto_principle&quot;&gt;&lt;em&gt;Paretovým principem&lt;/em&gt;&lt;/a&gt; tvrdí, že většina frameworků selhává proto, že se snaží řešit &lt;strong&gt;všechno&lt;/strong&gt;, všechny možné případy, abstrahovat až na úplně nejvyšší úroveň, a fetišizuje „teoreticky čistá řešení“. Hlavní pravidlo designu Rails pak konkrétně znamená např. to, že autor konfiguruje v aplikaci pouze to, co se liší od běžného nastavení — vytvoří-li tedy např. model &lt;code&gt;Person&lt;/code&gt;, aplikace bude data automaticky hledat v databázové tabulce &lt;code&gt;people&lt;/code&gt; (tedy v tabulce, která se jmenuje stejně jako model, avšak v množném čísle). Chce-li, aby aplikace načítala data z tabulky &lt;code&gt;staff&lt;/code&gt;, musí tak učinit výslovně.&lt;/p&gt;

&lt;p&gt;Ještě uvidíme konkrétně, jak Rails filosofii &lt;strong&gt;„nejjednodušší řešení je zpravidla nejsprávnější“&lt;/strong&gt; (viz &lt;a href=&quot;http://en.wikipedia.org/wiki/Occam%27s_razor&quot; title=&quot;Entia non sunt multiplicanda praeter necessitatem&quot;&gt;Occamova břitva&lt;/a&gt;) uplatňuje prakticky ve všech svých hlavních rysech. Ale už jen díky tomuto svému přístupu: &lt;a href=&quot;http://media.rubyonrails.org/presentations/secretsofrubyonrails.pdf&quot; title=&quot;PDF prezentace, 1.8MB&quot;&gt;„Flexibilita je přeceňována. Omezení jsou osvobozující“&lt;/a&gt; Rails vnesly do nekonečných technických debat o rychlosti interpreterů, o tom, jestli je XML lék na všechno, správném pojetí objektově orientovaného programování, a podobně, nikoliv pravdu, ale &lt;strong&gt;čerstvý vítr&lt;/strong&gt;. Pojďme se tedy podívat na principy, na nichž jsou Rails postaveny.&lt;/p&gt;

&lt;h2&gt;Model-View-Controller&lt;/h2&gt;

&lt;p&gt;Vyjdeme-li z definice v &lt;a href=&quot;/co-je-ruby-on-rails-cast-1&quot;&gt;prvním článku o Ruby on Rails&lt;/a&gt;, Rails jsou Model-View-Controller framework. Co to přesně znamená?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Model-view-controller&quot;&gt;Model-View-Controller&lt;/a&gt; (dále MVC) je ustálený &lt;em&gt;návrhový vzor&lt;/em&gt; v softwarovém vývoji, způsob, jak transparentně oddělit různé části aplikace (lhostejno či webové nebo desktopové) podle toho, jakou úlohu v ní hrají. &lt;strong&gt;Model&lt;/strong&gt; se stará o čtení a zapisování dat a o manipulaci s nimi („Vrať mi seznam osob, kde název zaměstnavatele je ‚Škoda Auto‘, seřazený vzestupně podle příjmení“); data předává &lt;em&gt;controlleru&lt;/em&gt;. &lt;strong&gt;Controller&lt;/strong&gt; (česky někdy zvaný &lt;em&gt;řadič&lt;/em&gt;) se stará o příjem vstupů ze strany uživatele aplikace („Proveď akci definovanou pro kliknutí na odkaz ‚Telefonní seznam‘“) a distribuci výstupů („Načti stránku s identifikátorem ‚telefonni-seznam‘“). &lt;strong&gt;View&lt;/strong&gt; (česky zvaný též &lt;em&gt;pohled&lt;/em&gt;, v kontextu webu též &lt;em&gt;šablona&lt;/em&gt;) obsahuje grafické rozhraní aplikace samotné, s definovanými ovládacími prvky (tlačítka, roletky, odkazy, …) a „dírami“, do nichž se leje obsah, který do &lt;em&gt;view&lt;/em&gt; předává &lt;em&gt;controller&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/6/17/mvc-pattern.png&quot; alt=&quot;Schéma Model-View-Controller architektury&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jestliže se podíváme na strukturu Rails aplikace, mělo by nám tedy být již pár věcí docela jasných:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;controllers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;helpers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;models&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;views&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ve složce &lt;em&gt;app&lt;/em&gt; se nacházejí složky pro &lt;em&gt;controllery&lt;/em&gt;, &lt;em&gt;modely&lt;/em&gt;, i &lt;em&gt;view&lt;/em&gt;. Tyto tři složky jsou srdcem Rails aplikace.  Jaké jsou tedy konkrétní součásti Rails z pohledu MVC? &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Převedení dat z relační databáze na objekty Ruby&lt;/strong&gt; (&lt;em&gt;object-relational mapping&lt;/em&gt;), které zajišťuje &lt;strong&gt;Active Record&lt;/strong&gt; (M)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Směrování&lt;/strong&gt; (&lt;em&gt;routing&lt;/em&gt;) — mapování URL na vnitřní řídící prvky: &lt;em&gt;controllery&lt;/em&gt; a jejich &lt;em&gt;metody&lt;/em&gt; (funkce) a &lt;strong&gt;předávání dat&lt;/strong&gt; mezi &lt;em&gt;controllery&lt;/em&gt; a &lt;em&gt;views&lt;/em&gt; (HTML šablonami) (C a V)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pomocné metody&lt;/strong&gt; pro práci s HTML formuláři, Ajaxem, formátování řetězců, data a času a rozšíření Ruby tříd (M a V)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Další klíčové součásti Rails jsou:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Skripty pro generování kódu&lt;/strong&gt;, tedy např. šablon pro modely nebo controllery, tzv. &lt;em&gt;lešení&lt;/em&gt; (&lt;em&gt;scaffolding&lt;/em&gt;) aplikace, a dalších (&lt;em&gt;script/generate&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konzole&lt;/strong&gt;  pro přímou interakci s modely běžící aplikace na příkazové řádce (&lt;em&gt;script/console&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Komunita a sdílení kódu&lt;/strong&gt; — nejlepší kód je ten, který nemusíte psát. Tedy pokud nejste sněhová vločka. :)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Těchto šest oblastí nám dává dobrou představu o tom, jak jsou Rails uspořádány, a zároveň na nich lze dobře demonstrovat, v čem spočívá jedinečnost a elegance Rails. V tomto článku si projdeme pouze bod první, tedy Active Record — ostatním bodům se bude věnovat článek následující.&lt;/p&gt;

&lt;h2&gt;Active Record&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Active_record&quot;&gt;Active Record&lt;/a&gt; je srdcem každé Rails aplikace. Tvoří jádro frameworku, a dokonale demonstruje intelektuální principy, na nichž jsou Rails založené, proto se u něj zdržíme nejprve a nejdéle.&lt;/p&gt;

&lt;p&gt;Jak již bylo řečeno, Active Record je &lt;a href=&quot;http://www.martinfowler.com/eaaCatalog/activeRecord.html&quot;&gt;návrhový vzor&lt;/a&gt;, který mapuje databázové tabulky na třídy a převádí řádky na objekty (tedy instance tříd) a sloupce na jejich atributy: z názvu třídy (&lt;em&gt;Article&lt;/em&gt;) odhadne název tabulky (&lt;em&gt;articles&lt;/em&gt;). (Pro tento odhad obsahuje jednoduchou implementaci anglického slovníku, která je snadno rozšiřitelná.) Zároveň v implementaci Rails obsahuje výkonné nástroje na práci s daty (čtení, zápis, validace) a pro vztahy mezi tabulkami–objekty (ono &lt;code&gt;Post has_many :comments&lt;/code&gt;, známé z podcastu). &lt;/p&gt;

&lt;p&gt;To znamená, že odstiňuje vývojáře od „surového SQL“ (&lt;code&gt;SELECT * FROM articles WHERE id = 1&lt;/code&gt;), od „vlastnoručního“ převádění výsledků dotazu na nativní datové entity a umožňuje efektivní práci na daleko vyšší úrovni. Zde je velmi dobře zřetelný intelektuální přínos Rails: 90% práce práce webového vývojáře spočívá právě v nekonečném psaní databázových dotazů &lt;code&gt;SELECT ...&lt;/code&gt;, &lt;code&gt;SELECT ... LEFT JOIN ...&lt;/code&gt;, &lt;code&gt;UPDATE ... WHERE ...&lt;/code&gt;, případně v jejich konfiguraci pro nějaké obalující třídy či metody. To je samozřejmě z hlediska efektivity absurdní: pamatujeme si Matzovo diktum „čím více kódu, tím více chyb“. Jestliže se v 80% procentech případů nazývá tabulka v databázi stejně jako model, pouze v množném čísle (což dává logiku, obsahuje totiž &lt;em&gt;více&lt;/em&gt; objektů, zatímco model reprezentuje povětšinou &lt;em&gt;jeden&lt;/em&gt; objekt), nemá smysl tento fakt dokola a dokola potvrzovat v konfiguraci.&lt;/p&gt;

&lt;p&gt;Proto místo dotazu &lt;code&gt;SELECT * FROM articles WHERE id = 1&lt;/code&gt;, který nám k vrátí data:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;+----+-------------+--------------------+--------+---------------------+
| id | title       | body               | author | created_at          |
+----+-------------+--------------------+--------+---------------------+
|  1 | Lorem Ipsum | Dolor sit amet ... | Cicero | 0000-00-00 00:00:00 | 
+----+-------------+--------------------+--------+---------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;v Rails vytvoříme třídu &lt;em&gt;Article&lt;/em&gt; (ano, následující kód je úplný, nejsou potřeba inicializační ani žádné jiné metody):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Article &amp;lt; ActiveRecord::Base
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;a napíšeme &lt;code&gt;Article.find(1)&lt;/code&gt;. Dostaneme objekt s příslušnými atributy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;--- !ruby/object:Article 
attributes: 
 id: &quot;1&quot;
 title: Lorem Ipsum
 body: Dolor sit amet ...
 author: Cicero
 created_at: 0000-00-00 00:00:00
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pokud bychom mermomocí chtěli, aby model používal tabulku &lt;em&gt;clanky&lt;/em&gt;, &lt;em&gt;my&lt;em&gt;important&lt;/em&gt;prefix_articles&lt;/em&gt;, nebo jinou, není nic &lt;a href=&quot;http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001012&quot;&gt;snazšího&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Article &amp;lt; ActiveRecord::Base
  set_table_name &quot;clanky&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Tím však možnosti, které nám Active Record pro efektivní práci při získávání dat dává, nekončí. Kromě prostého &lt;code&gt;find&lt;/code&gt;, které hledá záznam dle sloupce &lt;code&gt;id&lt;/code&gt;, můžeme využít jeho varianty:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Article.find(:all, :order =&amp;gt; 'created_at DESC')&lt;/code&gt; nám vrátí všechny záznamy v tabulce &lt;em&gt;articles&lt;/em&gt; seřazené sestupně dle data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Article.find_all_by_author('Cicero', :order =&amp;gt; 'title')&lt;/code&gt; nám vrátí všechny záznamy konkrétního autora seřazené vzestupně podle názvu (tyto metody se v Rails nazývají &lt;strong&gt;dynamické dotazy&lt;/strong&gt;, &lt;em&gt;dynamic finders&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Article.find_all_by_author_and_title('Cicero', 'Lorem Ipsum')&lt;/code&gt; ukazuje, jak můžeme dynamické dotazy kombinovat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bylo by asi ztrátou času vypisovat zde příslušné SQL dotazy, abychom si ukázali, kolik znaků (a tím i příležitostí k chybám) a energie jsme si ušetřili. Dynamické dotazy navíc krásně ukazují sílu objektově-relačního mapování.&lt;/p&gt;

&lt;p&gt;Řekli jsme ale, že Active Record nám dává nástroje nejenom pro získávání dat, ale i pro manipulaci s nimi. Co když tedy chceme změnit některý atribut daného záznamu/objektu?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;article = Article.find(1)
article.author = 'Seneca'
article.save
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jednodušší to být nemůže. Změním atribut objektu a ten uložím. Vypisovat zde ukázkové dotazy &lt;code&gt;'SELECT FROM ... UPDATE ... SET author='.$author.' WHERE id='.$id.'&lt;/code&gt;, důvěrně známé všem webovým vývojářům, je pravděpodobně opět zbytečné: absolutní rozdíl v úrovni přístupu je zřejmý sám od sebe. Třídy odvozené od Active Record obsahují pochopitelně i metody &lt;code&gt;create&lt;/code&gt; a &lt;code&gt;destroy&lt;/code&gt; pro vytváření a mazání záznamů. &lt;span class=&quot;note&quot;&gt;(Active Record v Rails obsahuje také metodu &lt;code&gt;find_by_sql&lt;/code&gt; pro specifické případy složitých dotazů, nebo například dotazů, které je třeba silně optimalizovat. Princip „konvence má přednost před konfigurací“ neznamená, že „konfigurace“, tedy odchylka od obvyklého, není možná.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;To ale stále není všechno, co nám Active Record poskytuje. Mapovat data z tabulek na „pole“ koneckonců umí kdekterá vlastnoručně stvořená knihovna pro PHP obalující připojení k databázi. Detailní popis Active Recordu přesahuje tento článek, ale pro naše ilustrační potřeby zmíníme dvě vlastnosti: validaci vstupních dat a vztahy mezi objekty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validace vstupních dat&lt;/strong&gt; je jednou ze základních podmínek bezpečnosti a správné funkce webových aplikací. Přesto je přístup mnoha programátorů k ní více než laxní. Implementace Active Record v Ruby on Rails má funkce pro validaci zabudované. Vezměme si tedy definici třídy &lt;em&gt;Article&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Article &amp;lt; ActiveRecord::Base
  validates_presence_of :author
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;V prostém jazyce říká, že atribut &lt;em&gt;author&lt;/em&gt; nesmí být prázdný (&lt;em&gt;article validates presence of author&lt;/em&gt;), tedy jinými slovy: článek musí mít autora — což je logické. Co se tedy stane, když se pokusíme uložit článek, který nemá autora, tedy: jehož atribut &lt;em&gt;author&lt;/em&gt; je prázdný řetězec?&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;article = Article.find(1)
article.author = ''
article.save!
=&amp;gt; ActiveRecord::RecordInvalid: Validation failed: Author can't be blank
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Boom! &lt;em&gt;Autor nesmí být prázdný.&lt;/em&gt; &lt;span class=&quot;note&quot;&gt;(Vysvětlení pro nadprůměrně všímavé: zatímco metoda &lt;code&gt;save&lt;/code&gt; z prvního příkladu vrací hodnoty &lt;code&gt;true&lt;/code&gt; nebo &lt;code&gt;false&lt;/code&gt; podle toho, zda se povedlo záznam uložit, &lt;em&gt;bang-metoda&lt;/em&gt; &lt;code&gt;save!&lt;/code&gt; z druhého příkladu při neúspěchu operace vyvolá definovanou výjimku. K &lt;em&gt;bang-metodám&lt;/em&gt; se ještě v rámci výkladu o Ruby vrátíme v některém z příštích článků.)&lt;/span&gt; Platí totéž, co pro ukládání záznamu výše: &lt;strong&gt;jednodušší to být nemůže&lt;/strong&gt;. Připočteme-li k tomu to, že Active Record je v Rails implementovaný tak, že formuláře jsou předvyplněny hodnotami objektu, že při neúspěšném uložení Active Record vrací chybu pro každý atribut (a můžeme ji tedy snadno vypsat k příslušnému poli) a že mezi další validační funkce patří např. &lt;code&gt;validates_length_of&lt;/code&gt;, &lt;code&gt;validates_uniqueness_of&lt;/code&gt;, &lt;code&gt;validates_format_of&lt;/code&gt; (využívající regulární výrazy), je opět zjevné, kolik kódu nám Rails šetří, kolik kódu &lt;strong&gt;vůbec nemusíme psát&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Poslední vlastností Active Record, kterou se v našem úvodu budeme zabývat, je podpora pro &lt;strong&gt;vztahy mezi objekty&lt;/strong&gt;. Náš příklad s třídou &lt;em&gt;Article&lt;/em&gt; totiž neodpovídá vývoji ve skutečném světě. Těžko bychom ve skutečné aplikaci měli autory článků uložené ve sloupečku tabulky &lt;em&gt;articles&lt;/em&gt;. Ne, vyčlenili bychom pro ně zvláštní tabulku, pravděpodobně tabulku s názvem &lt;em&gt;authors&lt;/em&gt;. Článek může mít více autorů, autor může napsat více článků, jde tedy o vztah &lt;em&gt;n ku m&lt;/em&gt;. Rails je, jak dobře víme, framework pro skutečný svět, ne pro zjednodušené tutoriály, a proto nám poskytuje nástroje i pro relativně složité vztahy mezi entitami podobného typu. Stačí nám jen dobře definovat vztahy v deklaraci tříd (tento kód je opět úplný, pro pouhé vzájemné propojení tabulek-objektů více nepotřebujeme):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Article &amp;lt; ActiveRecord::Base
  has_and_belongs_to_many :authors
end

class Author &amp;lt; ActiveRecord::Base
  has_and_belongs_to_many :articles
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nyní tedy vytvoříme nový článek, nového autora, a autora k článku přiřadíme:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;article = Article.new
article.title = &quot;Lorem Ipsum&quot;

cicero = Author.new
cicero.name = &quot;Cicero&quot;
cicero.email = &quot;cicero@senatus.gov&quot;
cicero.save!

article.authors &amp;lt;&amp;lt; cicero
article.save!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To nebylo těžké. Když se nyní podíváme na objekt &lt;em&gt;article&lt;/em&gt;, vidíme, že obsahuje pole s autory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; print article.to_yaml
--- &amp;amp;id002 !ruby/object:Article 
attributes: 
  body: 
  title: Lorem Ipsum
  id: 2
  created_at: 2007-06-16 02:23:40.124124 +02:00
authors: 
- &amp;amp;id001 !ruby/object:Author 
  attributes: 
    name: Cicero
    id: 3
    email: cicero@senatus.gov
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Zrovna tak z druhé strany, pokud bychom chtěli dostat seznam Ciceronových článků:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; print cicero.articles.to_yaml
--- 
- !ruby/object:Article 
  attributes: 
    body: 
    title: Lorem Ipsum
    id: &quot;2&quot;
    author_id: &quot;3&quot;
    article_id: &quot;2&quot;
    created_at: 2007-06-16 02:23:40
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;(Vysvětlení: metoda &lt;em&gt;to_yaml&lt;/em&gt;, kterou v uvedených příkladech používáme, je upomínkou další silné zbraně Rails: formátu &lt;a href=&quot;http://www.yaml.org/&quot;&gt;YAML&lt;/a&gt;, tedy „XML pro lidi“: způsobu &lt;a href=&quot;http://en.wikipedia.org/wiki/YAML#Examples&quot;&gt;čitelného zápisu&lt;/a&gt; strukturovaných dat. Rails jej využívají jednak pro konfigurace — např. připojení k databázi (&lt;em&gt;/config/database.yml&lt;/em&gt;) —, tak pro čitelné výpisy datových struktur — např. pro &lt;a href=&quot;http://api.rubyonrails.org/classes/ActionView/Helpers/DebugHelper.html#M000563&quot;&gt;ladění&lt;/a&gt; programu.)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;A jak nyní vypadají tabulky (&lt;em&gt;articles&lt;/em&gt;, &lt;em&gt;authors&lt;/em&gt;, &lt;em&gt;articles_authors&lt;/em&gt;) v databázi? Žádné velké překvapení nás nečeká:&lt;/p&gt;

&lt;table&gt;
  &amp;lt;caption&gt;&lt;em&gt;mysql&gt;&lt;/em&gt; &lt;strong&gt;select * from articles;&lt;/strong&gt;&amp;lt;/caption&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;title&lt;/th&gt;
    &lt;th&gt;body&lt;/th&gt;
    &lt;th&gt;created_at&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;2&lt;/td&gt;
    &lt;td&gt;Lorem Ipsum&lt;/td&gt;
    &lt;td&gt;&lt;em&gt;NULL&lt;/em&gt;&lt;/td&gt;
    &lt;td&gt;0000-00-00 00:00:00&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;table&gt;
  &amp;lt;caption&gt;&lt;em&gt;mysql&gt;&lt;/em&gt; &lt;strong&gt;select * from authors;&lt;/strong&gt;&amp;lt;/caption&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;name&lt;/th&gt;
    &lt;th&gt;email&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;3&lt;/td&gt;
    &lt;td&gt;Cicero&lt;/td&gt;
    &lt;td&gt;cicero@senatus.gov&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;table&gt;
  &amp;lt;caption&gt;&lt;em&gt;mysql&gt;&lt;/em&gt; &lt;strong&gt;select * from articles_authors;&lt;/strong&gt;&amp;lt;/caption&gt;
  &lt;tr&gt;
    &lt;th&gt;article_id&lt;/th&gt;
    &lt;th&gt;author_id&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;2&lt;/td&gt;
    &lt;td&gt;3&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;V grafickém vyjádření pak vztahy vypadají takto:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2007/6/16/habtm_1.png&quot; alt=&quot;Schéma vztahu has&lt;em&gt;and&lt;/em&gt;belongs_to_many&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Sloupce v tabulkách &lt;em&gt;articles&lt;/em&gt; a &lt;em&gt;authors&lt;/em&gt; odpovídají atributům našeho objektu, tabulky jsou na sobě nezávislé. Jejich propojení zajišťuje zvláštní tabulka s názvem &lt;em&gt;articles_authors&lt;/em&gt;, která obsahuje dva sloupce pro definici vztahu mezi článkem a autorem: &lt;em&gt;article_id&lt;/em&gt; a &lt;em&gt;author_id&lt;/em&gt;. To, co vypadá tak logicky, samozřejmě a jednoduše, je samozřejmě výsledkem složité &lt;strong&gt;odhadovací logiky v Rails&lt;/strong&gt;, nikoliv projevem nějaké inteligence stroje. Stroj neví a sám od sebe nemůže vědět, že tabulka s definicemi vztahů se jmenuje &lt;em&gt;articles_authors&lt;/em&gt;. To, že nemusíme stroji všechny tyto „logické“ a „samozřejmé“ fakty stále &lt;a href=&quot;http://redhanded.hobix.com/images/camping-xml-situps.png&quot;&gt;dokola a dokola&lt;/a&gt; sdělovat, je výsledkem aplikace několika prostých pravidel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Deklarace &lt;em&gt;has_and_belongs_to_many&lt;/em&gt; v modelech zajistí, že Active Record je bude považovat za propojené a přidá přístupové metody k propojeným objektům, např. ono &lt;code&gt;cicero.articles&lt;/code&gt;, použité v příkladu. &lt;span class=&quot;note&quot;&gt;&lt;em&gt;Has_and_belongs...&lt;/em&gt; je poměrně složitý název pro vztah &lt;em&gt;n ku m&lt;/em&gt;. Je odvozen z direktiv pro vztah &lt;em&gt;1 ku n&lt;/em&gt;: &lt;em&gt;has_many&lt;/em&gt; pro rodičovský objekt (&lt;em&gt;„Článek má mnoho komentářů“&lt;/em&gt;) a &lt;em&gt;belongs_to&lt;/em&gt; (&lt;em&gt;„Komentář patří ke článku“&lt;/em&gt;) pro jeho děti. Ve vztahu &lt;em&gt;n ku m&lt;/em&gt; jsou objekty ve složitějším vztahu: &lt;em&gt;„Článek má mnoho autorů. Autor má mnoho článků.“&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rails se v takovém případě podívají do databáze, zda najdou tabulku, jejíž název je tvořen názvy tabulek pro dané objekty, oddělené podtržítkem, v abecedním pořádku, tedy: &lt;em&gt;articles_authors&lt;/em&gt;. Pokud byste chtěli nebo potřebovali, aby tato tabulka měla jiný název, řekněme &lt;em&gt;authors_to_articles&lt;/em&gt;, žádný problém, jde o jednoduchou &lt;em&gt;konfiguraci&lt;/em&gt; vztahu v modelu: &lt;code&gt;Class Author ... has_and_belongs_to_many :articles, :join_table =&amp;gt; &quot;authors_to_articles&quot;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tabulka definující vztah pak má dva sloupce: &lt;em&gt;article_id&lt;/em&gt; a &lt;em&gt;author_id&lt;/em&gt; (každému vztahu odpovídá jeden řádek). I tyto parametry je možné konfigurovat — chceme-li, aby se klíč vztahu jmenoval jinak, není problém: &lt;code&gt;Class Author ... has_and_belongs_to_many :articles, :foreign_key =&amp;gt; &quot;clanek_id&quot;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nejsou v tom tedy žádná kouzla. Kouzla způsobuje &lt;strong&gt;lidmi vymyšlený a napsaný kód&lt;/strong&gt; v hlubinách Rails. Je to ale kód, který vy &lt;strong&gt;nemusíte vymýšlet&lt;/strong&gt; a který vy &lt;strong&gt;nemusíte psát&lt;/strong&gt;. Kouzla jsou způsobena důslednou aplikací principu &lt;em&gt;konvence má přednost před konfigurací&lt;/em&gt; v implementaci Active Record. Není důvod konfigurovat název tabulky, je-li v drtivé většině případů utvořen jako množné číslo od názvu třídy. Není důvod konfigurovat tabulku vztahů, jmenuje-li se v drtivé většině případů jako &lt;em&gt;název první tabulky podtržítko název druhé tabulky&lt;/em&gt;. Všechna data je třeba na vstupu validovat, proto je ošetření vstupních dat zabudováno přímo v Active Recordu.&lt;/p&gt;

&lt;p&gt;To ale není všechno. V běžné webové aplikaci potřebujeme běžně ještě další nástroje na práci s daty: sčítání, výpočty průměrných hodnot, hledání pomocí &lt;code&gt;LIKE&lt;/code&gt;, … Active Record v Ruby On Rails nám dává nástrojů mnohem více:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Kolik článků napsal Cicero?
print cicero.articles.count
=&amp;gt; 1

# Vrať mi články od Cicerona, které začínají na ‚Lor‘ 
cicero = Author.find_by_name('Cicero')
print cicero.articles.find(:all, :conditions =&amp;gt; &quot;title LIKE 'Lor%'&quot;).to_yaml
=&amp;gt; --- !ruby/object:Article 
   attributes: 
     body: 
     title: Lorem Ipsum
     id: &quot;2&quot;
     author_id: &quot;3&quot;
     article_id: &quot;2&quot;
     created_at: 2007-06-16 02:23:40
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jak je snad z předchozího výkladu o Active Record vidět, Ruby on Rails nejsou „nějaký“ webový framework. Jeho intelektuální úroveň je zcela jedinečná: díky kombinaci promyšlené konfigurace a použití akademických vzorů, jako je Active Record, a zároveň nemilosrdně pragmatického přístupu k vývoji dávají vývojáři do ruky silný nástroj, který nemá jen tak nějaké srovnání.&lt;/p&gt;

&lt;p&gt;V dalším článku výklad o Active Record doplníme o možnosti, které mu přidávají pluginy &lt;em&gt;acts_as_attachment&lt;/em&gt; a &lt;em&gt;acts_as_list&lt;/em&gt;, nejprve se však budeme věnovat zbylým slíbeným bodům.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Komplexní výklad Active Record naleznete v knize &lt;a href=&quot;http://www.pragmaticprogrammer.com/titles/rails/&quot;&gt;Agile Web Development with Rails&lt;/a&gt;, doposud nejlepší výukové a zároveň referenční knize o Rails, o níž si někdy také něco povíme.&lt;/span&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.karmi.cz/">
    <author>
      <name>karmi</name>
    </author>
    <id>tag:blog.karmi.cz,2007-06-16:35</id>
    <published>2007-06-16T22:00:00+00:00</published>
    <updated>2007-06-17T14:10:34+00:00</updated>
    <category term="Rails"/>
    <link href="http://blog.karmi.cz/2007/6/16/co-je-ruby-on-rails-cast-1" rel="alternate" type="text/html"/>
    <title>Ruby on Rails a revoluce ve v&#253;voji pro web. &#268;&#225;st prvn&#237;: Ruby</title>
<summary type="html">&lt;p&gt;Framework pro vývoj webových aplikací a stránek Ruby on Rails je v posledních dvou letech jedním z nejžhavějších témat mezi webovými vývojáři. Běží na něm nejslavnější aplikace „Webu 2.0“, usnadňuje tvorbu Ajaxových vychytávek a stal se slavným díky videu, kde autor naprogramuje za patnáct minut kompletní blog včetně administrace. V češtině o něm existuje zatím velmi málo informací obsahujících více než několik tezí a ukázek, a následující tři články by měly tuto díru alespoň částečně zaplnit.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Framework pro vývoj webových aplikací a stránek Ruby on Rails je v posledních dvou letech jedním z nejžhavějších témat mezi webovými vývojáři. Běží na něm nejslavnější aplikace „Webu 2.0“, usnadňuje tvorbu Ajaxových vychytávek a stal se slavným díky videu, kde autor naprogramuje za patnáct minut kompletní blog včetně administrace. V češtině o něm existuje zatím velmi málo informací obsahujících více než několik tezí a ukázek, a následující tři články by měly tuto díru alespoň částečně zaplnit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/assets/2007/6/17/rails.png&quot; height=&quot;64&quot; alt=&quot;Logo Ruby on Rails&quot; width=&quot;50&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Framework pro vývoj webových aplikací a stránek &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; si za poslední dva tři roky získal &lt;strong&gt;takovou&lt;/strong&gt; slávu, že jedni jsou nadšeni zcela nad míru běžně obvyklou a kážou Rails kudy chodí, druzí mluví o „pouhé módě“, „skvělém marketingu 37 Signals“ a „zbytečném &lt;em&gt;hype&lt;/em&gt;“. &lt;/p&gt;

&lt;p&gt;Z pohledu na významné vývojářské &lt;a href=&quot;http://www.37signals.com/svn/&quot; title=&quot;Signal vs. Noise&quot;&gt;blogy&lt;/a&gt; či &lt;a href=&quot;http://promosearch.atomz.com/search/promosearch?sp-a=sp1000a5a9&amp;amp;sp-f=ISO-8859-1&amp;amp;sp-t=general&amp;amp;sp-k=Articles%7CBooks%7CConferences%7COther%7CWeblogs&amp;amp;sp-x-1=cat&amp;amp;sp-p-1=phrase&amp;amp;sp-q-1=&amp;amp;sp-x-2=cat2&amp;amp;sp-q-2=&amp;amp;sp-c=25&amp;amp;sp-p=all&amp;amp;c=&amp;amp;p=&amp;amp;query=ruby+on+rails&amp;amp;sp-q=ruby+on+rails&amp;amp;search=Go&quot; title=&quot;O'Reilly Network&quot;&gt;weby&lt;/a&gt; nebo &lt;a href=&quot;http://media.rubyonrails.org/video/rails_take2_with_sound.mov&quot; title=&quot;Video, QuickTime 52MB&quot;&gt;videa, kde v patnácti minutách naprogramujete kompletní blog&lt;/a&gt; člověk rozhodně získá dojem, že Rails jsou mýtická &lt;a href=&quot;http://en.wikipedia.org/wiki/No_Silver_Bullet&quot;&gt;„stříbrná kulka“ softwarového vývoje&lt;/a&gt;, technologie, jejíž pouhé použití či nasazení několikanásobně zvyšuje produktivitu. A k dovršení všeho na Ruby on Rails běží nejslavnější aplikace a stránky současného webu: &lt;a href=&quot;http://basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt;, &lt;a href=&quot;http://shopify.com/&quot;&gt;Shopify&lt;/a&gt;, &lt;a href=&quot;http://corkd.com/&quot;&gt;Cork'd&lt;/a&gt;, &lt;a href=&quot;http://alistapart.com/&quot;&gt;A List Apart&lt;/a&gt; či &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Není třeba si tedy klást (řečnické) otázky jako &lt;a href=&quot;http://about.82ask.com/2007/04/05/ruby-on-rails/&quot;&gt;„Je Ruby on Rails stříbrná kulka?“&lt;/a&gt; a podobně, ale můžeme rovnou vyložit karty. Řekněme to narovinu:&lt;/p&gt;

&lt;p class=&quot;highlight&quot;&gt;&lt;strong&gt;Jestliže se zabýváte vývojem pro web, Ruby on Rails je to nejzajímavější, co se za poslední dva roky na tomto poli objevilo. Rails je &lt;em&gt;killer app&lt;/em&gt; webového vývoje.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Panebože! Slyším ty výkřiky! Ne Ajax? Ne PHP 5? Ne Script.aculo.us? Ne … Zend framework? Ne Adobe Apollo... tedy AIR? Ne. A nejenom proto, že Rails v sobě Ajax i Script.aculo.us zahrnují (a v jistém smyslu, k němuž se vrátíme, teprve akcelerují, neboli „staví na koleje“).&lt;/p&gt;

&lt;p&gt;Rails jsou jedinečné (a v tomto smyslu „nejzajímavější“) proto, že kromě mnoha ryze technických konceptů a inovací vnesly do webového vývoje zásadní &lt;strong&gt;intelektuální koncepty&lt;/strong&gt; a nové myšlenky. To je ohled, který v debatách ohledně Ruby on Rails pravidelně zapadá. Debaty ohledně Rails totiž trpí známým syndromem &lt;strong&gt;„to není nic nového pod sluncem“&lt;/strong&gt;. Poučná je v tomto smyslu debata k článku &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2007/03/why_was_rails_only_possible_wi.html&quot; title=&quot;O'Reilly Ruby&quot;&gt;„Proč bylo Ruby on Rails možné napsat pouze a jedině v Ruby?“&lt;/a&gt;. V ní se diskutující pravidelně vracejí k objevné myšlence, že „to samé“ je možné udělat v Pythonu nebo v Perlu, že Model-View-Controller není nic nového, že lepší než Rails je framework &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; pro Python nebo &lt;a href=&quot;http://www.catalystframework.org/&quot;&gt;Catalyst&lt;/a&gt; pro Perl. A další variace: to umí .NET/Java/atd. už dávno a líp, a navíc mají IDE, a striktní typování. PHP je rozšířenější, a rychlejší, a levnější na provoz. A s „free-hostingem“. Jenže na webu se nyní o ničem nemluví s takovým nadšením jako o Rails, a jasná volba pro všechny obdivované &lt;em&gt;start-upy&lt;/em&gt; není ani .NET, ani Python. Ani PHP.&lt;/p&gt;

&lt;p&gt;Tato diskuse totiž posuzuje Rails z omezeně &lt;strong&gt;technologického pohledu&lt;/strong&gt;. A z omezeně technologického pohledu je Ruby on Rails skutečně &lt;strong&gt;jen další MVC webový framework&lt;/strong&gt;. Co však Rails činí zajímavé a jedinečné jsou netechnické (ve striktním slova smyslu), intelektuální a sociální aspekty, kterými se chci zabývat v těchto článcích. Právě ty ve vývojářích vyvolávají pocit „všechno v Rails a už nikdy jinak“ a právě ty vyvolaly mohutnou vlnu nadšení a nové energie pro vývoj na webu. Postoj „všechno už tu bylo, všechno je pořád stejné, je to prostě práce“ jistě v nikom příliš &lt;a href=&quot;http://www.bitwisemag.com/2/What-s-Wrong-With-Ruby&quot; title=&quot;I don’t want someone chatting away to me and telling me how &amp;quot;cool&amp;quot; it all is (I’ve lived long enough as a computer programmer to know it’ll never really be &amp;quot;cool&amp;quot; to be one). I just want the straight facts, plainly put.&quot;&gt;entuziasmu nevzbudí&lt;/a&gt;. Nejprve však krátký úvod či opakování.&lt;/p&gt;

&lt;h2&gt;Co je Ruby a co je Ruby on Rails&lt;/h2&gt;

&lt;p&gt;Ruby on Rails je &lt;strong&gt;vývojový framework&lt;/strong&gt; postavený na bázi vzoru &lt;a href=&quot;http://en.wikipedia.org/wiki/Model-view-controller&quot;&gt;Model-View-Controller&lt;/a&gt; (podobně jako za všechny např. &lt;a href=&quot;http://struts.apache.org/&quot;&gt;Apache Struts&lt;/a&gt; či klon Rails pro PHP &lt;a href=&quot;http://www.cakephp.org/&quot;&gt;CakePHP&lt;/a&gt;), který automaticky mapuje URL na vnitřní řídící prvky aplikace, abstrahuje přístup k datům v databázi pomocí &lt;a href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot;&gt;Object-relational mapping&lt;/a&gt; („řádky“ v databázi se převedou na instance objektů, „sloupce“ na jejich atributy) a obsahuje rozsáhlé pomocné knihovny pro snadné generování HTML, práci s Ajaxem, formátování dat a další. „Naučit se Ruby on Rails“ tedy znamená seznámit se s konvencemi a principy, na nichž je postavené („kde jsou šablony?“, „jak zpracuji data z formuláře?“) a naučit se programovací jazyk, který Rails používají: Ruby. Protože Ruby je základem frameworku Ruby on Rails, a jeho koncepce Rails zásadně ovlivnila, zastavíme se nejprve u něj.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;, tedy &lt;strong&gt;programovací jazyk&lt;/strong&gt; samotný, v němž jsou Rails napsány a v němž píšete Rails aplikace, je relativně nový jazyk, který vytvořil Yukihiro Matsumoto („Matz“), a který vychází ze základního principu: programování je &lt;strong&gt;tvořivá činnost&lt;/strong&gt;, která vám má přinášet radost:&lt;/p&gt;

&lt;blockquote&gt;
„Věřím, že — alespoň do jisté míry — je smyslem života být šťastný. Na základě tohoto přesvědčení je Ruby navrženo tak, že je nejenom snadné, ale i zábavné v něm programovat. Ruby vám umožňuje soustředit se na kreativní stránku programování, a nepřidělává vám další starosti.“
&lt;p class=&quot;author&quot;&gt;&lt;span class=&quot;tilde&quot;&gt;~&lt;/span&gt; Yukihiro Matsumoto&lt;span class=&quot;source&quot;&gt;, předmluva k prvnímu vydání knihy &lt;a href=&quot;http://www.rubycentral.com/book/foreword.html&quot;&gt;Programming Ruby&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podobnou větu v předmluvě k referenční příručce programovacího jazyka by pravděpodobně čekal málokdo. Ostatní principy Ruby jsou však z tohoto základního principu odvozené — přestože se podobné uvažování o softwarovém vývoji může zdát &lt;em&gt;hardcore geekům&lt;/em&gt; trochu divné. Výchozí motivací Matsumota bylo vytvořit jazyk, s nímž bude &lt;strong&gt;radost pracovat&lt;/strong&gt; a který dá programátorovi co nejkomfortnější &lt;strong&gt;vyjadřovací prostředky&lt;/strong&gt;. Fakt, že to znamená dokonale objektově orientovaný jazyk, perfektně integrované regulární výrazy, snadno čitelnou, úspornou syntaxi a pohodlné iterátory typu &lt;code&gt;10.times {puts &quot;ahoj&quot;}&lt;/code&gt;, je přitom zcela vedlejší. Matsumoto se totiž přímo &lt;a href=&quot;http://cs.byu.edu/colloquia_files/2006Fall/presentations/Matz_slides/mgp00011.html&quot;&gt;odvolává&lt;/a&gt; na hypotézu &lt;a href=&quot;http://cs.wikipedia.org/wiki/Jazykový_relativismus&quot;&gt;&lt;strong&gt;jazykového relativismu&lt;/strong&gt;&lt;/a&gt;, která tvrdí, že vnímání světa a způsob myšlení je radikálním způsobem ovlivněno právě vyjadřovacími prostředky, tedy &lt;strong&gt;jazykem&lt;/strong&gt;, kterým mluvíme. Tato hypotéza tvrdí nejenom to, že v různých jazycích myslíme různým způsobem. Ve své radikální podobě tato hypotéza v teorii Ludwiga Wittgensteina tvrdí, že &lt;strong&gt;to, co nemohu v jazyce vyjádřit, nemohu ani myslet&lt;/strong&gt; (&lt;em&gt;Filosofická zkoumání&lt;/em&gt;, &lt;span class=&quot;note&quot;&gt;§243 a následující&lt;/span&gt;).&lt;/p&gt;

&lt;p&gt;Matsumoto tuto hypotézu vztahuje i na jazyky zvané &lt;strong&gt;programovací&lt;/strong&gt;: programovací jazyk je totiž specifickým případem umělého jazyka, který má syntaxi, gramatiku i slovní zásobu, stejně jako jazyky přirozené. Vykládá ji tak, že čím pohodlněji se mohu &lt;strong&gt;vyjádřit&lt;/strong&gt;, tím pohodlněji mohu i &lt;strong&gt;myslet&lt;/strong&gt; — a v programování jde pochopitelně především o myšlení, o „výsledek“: o to, co má program dělat („nahradit všechny výrazy XXX v řetězci za YYY“, „vypsat všechny články z databáze publikované tento měsíc“, atd.). Syntaxe, gramatika, slovní zásoba, to jsou vyjadřovací prostředky, které usnadňují či znesnadňují vyjádření samotné — nejsou však vůči vyjadřované „myšlence“ nijak sekundární. Napsat program, který nahradí výraz XXX za YYY lze stejně tak v Javě, PHP, Ruby nebo assembleru, ale &lt;strong&gt;pohodlnost&lt;/strong&gt;, s jakou tuto (triviální) myšlenku v jednotlivých jazycích vyjádříte, bude dost rozdílná. „V assembleru můžete napsat všechno. Nikdo ale už nechce psát v assembleru“ (&lt;a href=&quot;http://www.artima.com/intv/ruby.html&quot;&gt;Yukihiro Matsumoto, &lt;em&gt;The Philosophy of Ruby&lt;/em&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;&lt;em&gt;Upozornění!&lt;/em&gt; Následující text srovnává syntaxi Ruby a PHP. Účelem srovnání &lt;strong&gt;není&lt;/strong&gt; dokazovat, která syntaxe je „lepší“. Účelem je demonstrovat filosofii, na které je Ruby založena. Možná se vám tato filosofie bude zdát mylná, nepodstatná nebo lhostejná. Možná se vám bude zdát, že to je „stejně jedno“, že je jazyk jako jazyk a navíc je důležitější striktní typování, výkonnostní parametry nebo paletka &lt;em&gt;Změnit všechny výskyty…&lt;/em&gt; ve „vašem IDE“. Pak vás následující argumentace asi nepřesvědčí.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Právě určitá &lt;strong&gt;expresivita&lt;/strong&gt; jazyka, tedy snadnost, s jakou vyjadřuje myšlenky (programátora) je základní vlastností a rozlišovacím znakem Ruby. Rozdíl mezi „příkazem“, tak jak si jej v duchu řekneme, a skutečným kódem je v Ruby minimální. Srovnejte následující úryvek kódu v PHP, důvěrně známý všem webovým programátorům:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ( !empty($this-&amp;gt;email) ) echo $this-&amp;gt;email;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Stejný úryvek v Ruby, resp. v &lt;a href=&quot;http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/core_ext/blank.rb&quot;&gt;rozšíření Rails&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;print self.email unless self.email.blank?
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Srovnání není určeno k posouzení toho, který jazyk je „lepší“, protože to vždy znamená otázku „lepší k čemu?“ nebo „lepší pro koho?“ a ty si zde neklademe, protože si je pokládá každý sám za sebe. Oba zápisy jsou si velmi podobné — na rovině syntaxe však první příklad připomíná spíše &lt;strong&gt;rovnici&lt;/strong&gt; (matematický symbol negace, závorky), zatímco příklad druhý vypadá jako jednoduchá &lt;strong&gt;věta&lt;/strong&gt; v přirozeném jazyce: „Vypiš proměnnou, pokud není prázdná“. &lt;em&gt;Print something to screen, unless that something is blank&lt;/em&gt; — dokonce se správným slovosledem. Podmínka &lt;code&gt;unless&lt;/code&gt; zde slouží jako modifikátor (&lt;em&gt;modifier&lt;/em&gt;) příkazu &lt;code&gt;print&lt;/code&gt;. To, který způsob zápisu se vám zdá přehlednější, záleží zčásti na tom, zda myslíte spíše „v rovnici“, nebo „ve větě“, a především na tom, na co jste zvyklí. Díky síle zvyku se často syntaxe Ruby zdá na první pohled „divná“. Ale při řešení abstraktních problémů je přeci jen většina z nás zvyklá přemýšlet „ve větách“, dal by se shrnout přístup Ruby.&lt;/p&gt;

&lt;p&gt;„Vypiš proměnnou, pokud není prázdná“ je velmi, velmi triviální myšlenka. Tuto triviální myšlenku můžeme vyjádřit buď složitým, nebo jednoduchým zápisem. Symbol negace, striktní pravidla pro použití závorek — to vše je trivialitě oné myšlenky v zásadě cizí. V tom je tento příklad příznačný: programátoři webových aplikací velmi často na podobnou kontrolu hodnoty proměnné nedbají. Je otázka, zda a nakolik v tom má prsty přílišná striktnost syntaxe PHP. (Je přitom jisté, že chyby v nesprávně uzavřených nebo překřížených závorkách jsou v PHP jedny z nejčastějších.)&lt;/p&gt;

&lt;p&gt;Vezměme si však jiný příklad, převzatý z nejoriginálnější učebnice jazyka Ruby, &lt;a href=&quot;http://poignantguide.net/ruby/&quot;&gt;Why's Poignant Guide to Ruby&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;5.times { print &quot;Hurá! &quot; }
=&amp;gt; ‚Hurá! Hurá! Hurá! Hurá! Hurá!‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Five times print &quot;Hurá&quot;&lt;/em&gt;, neboli „pětkrát napiš ‚Hurá!‘“ je opět věta v přirozeném jazyce, v angličtině, a opět se správným slovosledem. Vidíme, že zahrnuje „matematické znaky“ (složené uvozovky), ty ale slouží víceméně jako interpunkce — například pomlčky nebo čárky --, pro oddělení částí souvětí.&lt;/p&gt;

&lt;p&gt;Tato „literární povaha“ je pro Ruby zcela zásadní a velmi ovlivnila právě framework Ruby on Rails. Jak &lt;a href=&quot;http://podcast.rubyonrails.org/programs/1/episodes/dan_benjamin&quot; title=&quot;Audio MP3&quot;&gt;říká&lt;/a&gt; vývojář &lt;a href=&quot;http://hivelogic.com/&quot;&gt;Dan Benjamin&lt;/a&gt;: „Ruby vám umožňuje se skvěle vyjádřit, a nemusíte u toho psát tucty řádků komenářů — kód v Ruby je srozumitelný sám od sebe“. I programátor, který Ruby neovládá, velmi dobře porozumí kódu, jako je:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;print [&quot;banán&quot;, &quot;citron&quot;, &quot;ananas&quot;].sort.last.capitalize
=&amp;gt; ‚Citron‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;„Porozumí“ přitom znamená: „odhadne výstup programu“, porozumí tomu, co program udělá (tedy oné „myšlence“), nikoliv nutně syntaxi. Důležité je, že uvedenému kousku kódu porozumí i neprogramátor se základní znalostí angličtiny, na rozdíl od identického kódu např. v PHP:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$a = Array(&quot;banán&quot;, &quot;citron&quot;, &quot;ananas&quot;);
sort($a);
print ucwords( end($a) );
=&amp;gt; ‚Citron‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Z tohoto důvodu je Ruby oblíbeným a často používaným programovacím jazykem pro &lt;a href=&quot;http://pine.fm/LearnToProgram/&quot;&gt;výuku programování&lt;/a&gt;. Jak &lt;a href=&quot;http://podcast.rubyonrails.org/programs/1/episodes/chris_pine&quot; title=&quot;Audio MP3&quot;&gt;říká&lt;/a&gt; autor knihy &lt;a href=&quot;http://www.pragmaticprogrammer.com/titles/fr_ltp/&quot;&gt;Learn to Program&lt;/a&gt;, Chris Pine, Ruby je ideálním jazykem pro výuku programování, protože psát v něm programy je za á snadné a za bé je to zábava. (Úplně jinou kapitolou v použití Ruby pro výuku programování je projekt Ruby artisty Why The Lucky Stiffa &lt;a href=&quot;http://hacketyhack.net/&quot;&gt;&lt;strong&gt;Hackety Hack&lt;/strong&gt;&lt;/a&gt;, k němuž se zajisté ještě vrátíme.)&lt;/p&gt;

&lt;p&gt;Na uvedených úryvcích kódu je ihned vidět jedna důležitá vlastnost Ruby: &lt;strong&gt;řetězení&lt;/strong&gt; (&lt;em&gt;chainability&lt;/em&gt;). Metody, které jsou volány na objektu (v tomto případě poli), vrací objekt samotný, takže lze volání metod řetězit a předávat si jej mezi nimi. &lt;span class=&quot;note&quot;&gt;(Řetězení prostřednictvím Rails ovlivnilo mnoho dalších projektů, typicky např. JavaScript frameworky &lt;a href=&quot;http://encytemedia.com/blog/articles/2006/08/30/a-flurry-of-prototype-updates&quot;&gt;Prototype.js&lt;/a&gt;, &lt;a href=&quot;http://docs.jquery.com/How_jQuery_Works#Chainability_.28The_Magic_of_jQuery.29&quot;&gt;JQuery&lt;/a&gt; nebo &lt;a href=&quot;http://dev.april-child.com/fry/test/test-ac.fry.html&quot;&gt;Fry&lt;/a&gt;.)&lt;/p&gt; Řetězení se neuplatňuje jen v případě triviálních operací jako je seřazení pole, ale i v daleko sofistikovanějších výstupech (s výjimkou přetypovací metody &lt;code&gt;to_a&lt;/code&gt;, neboli &lt;em&gt;to array&lt;/em&gt; je uvedený kód na první pohled srozumitelný):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html
require 'net/http' 
print Net::HTTP.get('www.google.cz', '/').match(&quot;&amp;lt;title&amp;gt;(.*)&amp;lt;\/title&amp;gt;&quot;).to_a.last
=&amp;gt; ‚Google‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podobně jako podmínkové modifikátory (&lt;code&gt;print variable unless variable.blank?&lt;/code&gt;) je řetězení silnou zbraní Ruby, protože umožňuje psát velmi &lt;strong&gt;čitelný&lt;/strong&gt; a &lt;strong&gt;úsporný&lt;/strong&gt; kód: jak říká známý teorém o jazyce &lt;a href=&quot;http://www.paulgraham.com/power.html&quot;&gt;Python&lt;/a&gt;, „V úspornosti je síla“ (&lt;em&gt;Succinctness is power&lt;/em&gt;). Nebo, jak praví známý aforismus, počítačový kód má být v první řadě čitelný pro lidi, a jen mimochodem též pro stroje.&lt;/p&gt;

&lt;p&gt;Proč je tomu tak? Jak &lt;a href=&quot;http://www.itconversations.com/shows/detail1638.html&quot; title=&quot;Audio MP3, 21. minuta&quot;&gt;říká&lt;/a&gt; Matz: &lt;cite&gt;Úsporný kód znamená méně chyb — čím méně řádků kódu, tím méně chyb. A méně chyb znamená, že se cítíte chytřejší.&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;To je to, co Matz v uvedené přednášce nazývá „efektivita měřená počtem úderů do klávesnice“ (&lt;em&gt;efficiency in keystrokes&lt;/em&gt;) — nikoliv efektivita z hlediska výpočetního výkonu, ale z hlediska produktivity. Úspornost a čitelnost kódu, snadno zapamatovatelná syntaxe bez obtížné „interpunkce“ — to vše slouží k tomu, aby se programátor mohl &lt;strong&gt;soustředit na „myšlenku“ a ne na to, jak ji vyjádřit&lt;/strong&gt;. Lze říci, že všechny ostatní, ryze technické vlastnosti Ruby jsou podřízeny tomuto principu. Kruh se uzavírá:&lt;/p&gt;

&lt;blockquote&gt;
    Programujeme proto, že nás to baví. I když programujeme pro peníze, stejně chceme, aby nás to bavilo.
    &lt;p class=&quot;author&quot;&gt;&lt;span class=&quot;tilde&quot;&gt;~&lt;/span&gt; Yukihiro Matsumoto&lt;span class=&quot;source&quot;&gt;, přednáška na &lt;a href=&quot;http://cs.byu.edu/colloquia_files/2006Fall/presentations/Matz_slides/mgp00031.html&quot;&gt;Brigham Young University&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Proč tak rozsáhlý úvod do Ruby v článku, který má Ruby on Rails ve svém názvu? Protože základní principy Ruby zde shrnuté ovlivnily návrh celého frameworku Rails (ať již se jedná o princip „konvence má přednost před konfigurací“, o využití známých návrhových vzorů jako je &lt;a href=&quot;http://en.wikipedia.org/wiki/ActiveRecord&quot;&gt;Active Record&lt;/a&gt;, a další). Takže až potkáme podobný úryvek kódu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# http://api.rubyonrails.com/classes/ActiveSupport/CoreExtensions/Numeric/Time.html#M000394
10.minutes.ago 
=&amp;gt; Sat May 26 19:52:58 +0200 2007
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;nebo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# http://api.rubyonrails.com/classes/ActionView/Helpers/DateHelper.html#M000575
t = Article.find_by_id(1).published_at
=&amp;gt; Sat May 26 19:02:12 +0200 2007
time_ago_in_words(t) 
=&amp;gt; ‚about one hour‘
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;budeme přesně vědět, odkud vítr vane. Popularita Ruby skokově vzrostla právě díky Ruby on Rails — jak říká samotný Matz: &lt;a href=&quot;http://www.slideshare.net/vishnu/the-top-10-reasons-the-ruby-programming-language-sucks/&quot;&gt;„Rails jsou pro Ruby &lt;em&gt;killer app&lt;/em&gt;“&lt;/a&gt;. Rails samotné se pak staly populárními díky tomu, že se přesně trefily do neuspokojivé situace na poli vývoje pro web, kterému vládlo (a vládne) PHP, se svými světlými i temnými stránkami, s nedostatečně ukotvenými pravidly vývoje, kdy každý vývojář objevuje Ameriku. Vzbudily v komunitě vývojářů nadšení, protože usnadnily práci s &lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;Ajaxem&lt;/a&gt; a &lt;a href=&quot;http://script.aculo.us/&quot;&gt;vizuálními efekty&lt;/a&gt; a umožnily vývojářům soustředit se konečně na to, &lt;strong&gt;co&lt;/strong&gt; chtějí udělat, než na to, &lt;strong&gt;jak&lt;/strong&gt; toho dosáhnout. Co je ale na Rails tak fascinujícího, že o málokteré technologii se mluví s takovým nadšením? Proč prodeje knih o Ruby on Rails rostou na angloamerickém trhu &lt;a href=&quot;http://radar.oreilly.com/archives/2007/05/state_of_the_co_6.html&quot;&gt;nejrychleji z celé oblasti web designu&lt;/a&gt;? Právě tomu se bude věnovat další článek.&lt;/p&gt;

&lt;h2&gt;Poznámky a odkazy:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Všechny uvedené příklady Ruby si můžete vyzkoušet ve webové verzi konzole: &lt;a href=&quot;http://tryruby.hobix.com/&quot;&gt;http://tryruby.hobix.com/&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;První vydání základní referenční příručky k Ruby, &lt;em&gt;The Pickaxe Book&lt;/em&gt;, je přístupné online: &lt;a href=&quot;http://www.ruby-doc.org/docs/ProgrammingRuby/&quot;&gt;http://www.ruby-doc.org/docs/ProgrammingRuby/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pro neředěný zážitek z Ruby a s Ruby ovšem doporučuji dobrodružný cestopis &lt;em&gt;Why's (Poignant) Guide to Ruby&lt;/em&gt;: &lt;a href=&quot;http://www.poignantguide.net/&quot;&gt;http://www.poignantguide.net/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pro další článek nemusíte znát nic více než ono &lt;a href=&quot;http://media.rubyonrails.org/video/rails_take2_with_sound.mov&quot;&gt;video, které všechno začalo&lt;/a&gt; &lt;span class=&quot;note&quot;&gt;(alespoň v mém případě)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span class=&quot;note&quot;&gt;Poděkování patří Vítku Burdovi, Vráťovi Čermákovi, Petru Krontorádovi, Pavlu Šimkovi a Václavu Vančurovi za cenné podněty, připomínky, rady a opravy při přípravě článku.&lt;/span&gt;&lt;/p&gt;
          </content>  </entry>
</feed>

