{"id":282,"date":"2011-02-24T11:11:06","date_gmt":"2011-02-24T11:11:06","guid":{"rendered":"http:\/\/blog.igloonet.cz\/?p=282"},"modified":"2014-08-11T22:00:52","modified_gmt":"2014-08-11T20:00:52","slug":"zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2","status":"publish","type":"post","link":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/","title":{"rendered":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s&nbsp;frameworkem Ruby on Rails (d\u00edl&nbsp;2.)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Kdy\u017e jsem p\u0159ed necel\u00fdm m\u011bs\u00edcem za\u010dal ps\u00e1t tento \u010dl\u00e1nek, tak jsem si \u0159\u00edkal, \u017ee&nbsp;bych r\u00e1d v\u0161em sv\u00fdm \u010dten\u00e1\u0159\u016fm p\u0159ibl\u00ed\u017eil n\u00e1stroj, kter\u00fd dennodenn\u011b pou\u017e\u00edv\u00e1m ve&nbsp;sv\u00e9m zam\u011bstn\u00e1n\u00ed. Jednalo se o&nbsp;webov\u00fd framework Ruby on Rails. P\u016fvodn\u011b jsem ne\u010dekal, \u017ee&nbsp;budu nucen\u00fd kv\u016fli rozsahu cel\u00fd \u010dl\u00e1nek rozd\u011blit do&nbsp;dvou d\u00edl\u016f. Prvn\u00ed \u010d\u00e1st se soust\u0159edila na&nbsp;samotn\u00fd z\u00e1klad a&nbsp;to na&nbsp;programovac\u00ed jazyk Ruby. Tento \u010dl\u00e1nek je dal\u0161\u00edm pokra\u010dov\u00e1n\u00edm a&nbsp;je v\u011bnov\u00e1n hlavn\u00edm vlastnostem frameworku Ruby on Rails, kter\u00e9 p\u0159\u00edpadn\u00e9 z\u00e1jemce nejv\u00edce zaj\u00edmaj\u00ed.<!--more--><\/p>\n<h2>Architektura MVC<\/h2>\n<p>Ruby on Rails jsou postaveny na&nbsp;n\u00e1vrhov\u00e9m vzoru Model-View-Controller. Jedn\u00e1 se o&nbsp;z\u00e1klad kvalitn\u00edho objektov\u00e9ho n\u00e1vrhu. V&nbsp;principu MVC rozd\u011bluje n\u00e1\u0161 syst\u00e9m do&nbsp;t\u0159\u00ed logicky nez\u00e1visl\u00fdch \u010d\u00e1st\u00ed. Na&nbsp;datov\u00fd model aplikace, u\u017eivatelsk\u00e9 rozhran\u00ed a&nbsp;\u0159\u00edd\u00edc\u00ed logiku.<\/p>\n<p><img decoding=\"async\" src=\"\/blog\/wp-content\/uploads\/2011\/02\/test.png\" alt=\"Model-View-Controller\" \/><\/p>\n<ul>\n<li><strong>Model (Model)<\/strong> - Model zaji\u0161\u0165uje zpracov\u00e1n\u00ed dat. Ve&nbsp;skute\u010dnosti pak p\u0159edstavuje jak\u00e9si rozhran\u00ed mezi datab\u00e1z\u00ed a&nbsp;\u0159adi\u010dem.<\/li>\n<li><strong>Pohled (View)<\/strong> - Pohled zodpov\u00edd\u00e1 za v\u00fdsledn\u00e9 zobrazen\u00ed dat p\u0159edan\u00fdch modelem. Podstatn\u00e9 a&nbsp;d\u016fle\u017eit\u00e9 z&nbsp;hlediska struktury aplikace je to, \u017ee&nbsp;samo grafick\u00e9 rozhran\u00ed neobsahuje ani vlastn\u00ed data (to je \u00fakolem modelu), ani logiku pr\u00e1ce s&nbsp;nimi (o&nbsp;to se staraj\u00ed \u0159adi\u010de). Jednou z&nbsp;nejb\u011b\u017en\u011bj\u0161\u00edch a&nbsp;nej\u010dast\u011bji opakovan\u00fdch chyb p\u0159i objektov\u00e9m n\u00e1vrhu jsou pr\u00e1v\u011b pohledy obsahuj\u00edc\u00ed data \u010di \u0159\u00edd\u00edc\u00ed rutiny.<\/li>\n<li><strong>\u0158adi\u010d (Controller)<\/strong> - \u0158adi\u010d p\u0159eb\u00edr\u00e1 vstupy od&nbsp;u\u017eivatele vyvolan\u00e9 vstupn\u00edmi objekty v&nbsp;r\u00e1mci pohledu (nap\u0159\u00edklad nab\u00eddkami, tla\u010d\u00edtky a&nbsp;podobn\u011b). Zpracuje je podle pot\u0159eby a&nbsp;pak \u0159\u00edd\u00ed cel\u00e9 zobrazen\u00ed dat na&nbsp;v\u00fdstup. Zaji\u0161\u0165uje tak logiku chov\u00e1n\u00ed cel\u00e9ho syst\u00e9mu. P\u0159itom samoz\u0159ejm\u011b podle pot\u0159eby spolupracuje s&nbsp;modelem. P\u0159ed\u00e1v\u00e1 mu po\u017eadavky na&nbsp;zm\u011bny, a&nbsp;kdykoli je to zapot\u0159eb\u00ed, vy\u017e\u00e1d\u00e1 si od&nbsp;n\u011bj \u00fadaje pro zobrazen\u00ed.<\/li>\n<\/ul>\n<h2>Webov\u00fd framework Ruby on Rails<\/h2>\n<p>Ofici\u00e1ln\u00ed verze Ruby on Rails spat\u0159ila sv\u011btlo sv\u011bta v&nbsp;\u010dervenci 2004. Za jeho vznikem stoj\u00ed d\u00e1nsk\u00fd program\u00e1tor David Heinemeier Hansson. P\u0159i samotn\u00e9m v\u00fdvoji byl pou\u017eit n\u00e1stroj projektov\u00e9ho \u0159\u00edzen\u00ed Basecamp. Jak u\u017e bylo n\u011bkolikr\u00e1t zm\u00edn\u011bno, jedn\u00e1 se o&nbsp;takzvan\u00fd webov\u00fd framework. C\u00edlem frameworku je p\u0159evzet\u00ed typick\u00fdch probl\u00e9m\u016f dan\u00e9 oblasti, \u010d\u00edm\u017e se usnadn\u00ed v\u00fdvoj tak, aby se n\u00e1vrh\u00e1\u0159i a&nbsp;v\u00fdvoj\u00e1\u0159i mohli soust\u0159edit pouze na&nbsp;zad\u00e1n\u00ed sv\u00e9 pr\u00e1ce. Mezi z\u00e1kladn\u00ed princip Rails pat\u0159\u00ed: \"Konvence m\u00e1 p\u0159ednost p\u0159ed konfigurac\u00ed\", tedy, \u017ee&nbsp;program\u00e1tor konfiguruje pouze ty \u010d\u00e1sti aplikace, kter\u00e9 se li\u0161\u00ed od&nbsp;b\u011b\u017en\u00e9ho nastaven\u00ed. Vytvo\u0159\u00ed-li tedy nap\u0159. model <em>Person<\/em>, aplikace bude data automaticky hledat v&nbsp;tabulce <em>people<\/em>. Chce-li, aby aplikace na\u010d\u00edtala data z&nbsp;jin\u00e9 tabulky, nap\u0159\u00edklad <em>users<\/em>, mus\u00ed tak u\u010dinit v\u00fdslovn\u011b.<\/p>\n<p><cite>Ruby on Rails jsou pr\u016flomov\u00e9 v\u00a0sni\u017eov\u00e1n\u00ed bari\u00e9r pro vstup do&nbsp;programov\u00e1n\u00ed. Mocn\u00e9 aplikace, jejich\u017e v\u00fdvoj v&nbsp;minulosti trval t\u00fddny \u010di m\u011bs\u00edce, mohou b\u00fdt vytvo\u0159eny b\u011bhem n\u011bkolika dn\u00ed.<br \/>\n--Tim O'Reilly, zakladatel O'Reilly Media<br \/>\n<\/cite><\/p>\n<h3>Z\u00e1kladn\u00ed vlastnosti<\/h3>\n<p>P\u0159i v\u00fdvoji se zajist\u00e9 spousta program\u00e1tor\u016f setkala se situacemi, kdy jsou pou\u017e\u00edv\u00e1ny opakuj\u00edc\u00edch se \u010d\u00e1st\u00ed k\u00f3du. Form\u00e1tov\u00e1n\u00ed data, spr\u00e1vn\u00fd v\u00fdpis m\u011bny, zobrazen\u00ed varovn\u00fdch nebo informativn\u00edch hl\u00e1\u0161en\u00ed pro formul\u00e1\u0159ov\u00e9 polo\u017eky. Lze jich vyjmenovat opravdu hodn\u011b. Nikoho tedy nep\u0159ekvap\u00ed, \u017ee&nbsp;Ruby on Rails p\u0159ich\u00e1z\u00ed s&nbsp;\u0159adou roz\u0161\u00ed\u0159en\u00ed, jak uleh\u010dit nej\u010dast\u011bj\u0161\u00ed p\u0159\u00edpady t\u011bchto \u00fakon\u016f. Obsahuj\u00ed tyto dv\u011b z\u00e1kladn\u00ed roz\u0161\u00ed\u0159en\u00ed: <em>roz\u0161\u00ed\u0159en\u00ed jazyka Ruby<\/em> (Core Extensions) a&nbsp;<em>pomocn\u00e9 metody<\/em> (helpers).<\/p>\n<p>Roz\u0161\u00ed\u0159en\u00ed jazyka Ruby dopl\u0148uj\u00ed z\u00e1kladn\u00ed t\u0159\u00eddy <em>Array<\/em>, <em>Date<\/em>, <em>Hash<\/em>, <em>Numeric<\/em> a&nbsp;<em>String<\/em> o&nbsp;<em>pohodln\u00e9 metody<\/em> (convenience methods), kter\u00e9 zjednodu\u0161uj\u00ed \u010dasto se opakuj\u00edc\u00ed operace. V\u0161echna tato roz\u0161\u00ed\u0159en\u00ed velice posiluj\u00ed vyjad\u0159ovac\u00ed schopnost jazyka Ruby. Typick\u00fdm p\u0159\u00edkladem m\u016f\u017ee b\u00fdt zji\u0161t\u011bn\u00ed, zda je \u010d\u00edslo sud\u00e9 \u010di lich\u00e9, kter\u00e9 lze vyu\u017e\u00edt t\u0159eba pro st\u0159\u00edd\u00e1n\u00ed barvy pozad\u00ed \u0159\u00e1dk\u016f tabulky:<\/p>\n<pre>\r\n7.even?\r\n=> false\r\n<\/pre>\n<p>Dal\u0161\u00ed p\u011bknou uk\u00e1zkou je pr\u00e1ce s&nbsp;datem, kdy v\u00fdvoj\u00e1\u0159 m\u016f\u017ee cht\u00edt zjistit, jak\u00fd \u010das byl p\u0159ed p\u011bti minutami. Sta\u010d\u00ed pak pou\u017e\u00edt n\u00e1sleduj\u00edc\u00ed vol\u00e1n\u00ed, kter\u00e9 vr\u00e1t\u00ed po\u017eadovan\u00fd \u00fadaj.<\/p>\n<pre>\r\n5.minute.ago\r\n<\/pre>\n<p>Pomocn\u00e9 t\u0159\u00eddy Rails se od&nbsp;roz\u0161\u00ed\u0159en\u00ed t\u0159\u00edd Ruby li\u0161\u00ed. Svoje vyu\u017eit\u00ed maj\u00ed pouze v&nbsp;pohledech. Slou\u017e\u00ed op\u011bt ke&nbsp;zjednodu\u0161en\u00ed form\u00e1tov\u00e1n\u00ed a&nbsp;generov\u00e1n\u00ed k\u00f3du. Typicky tak lze na&nbsp;str\u00e1nce snadno vytv\u00e1\u0159et pot\u0159ebn\u00e9 prvky jazyka HTML. P\u0159i pot\u0159eb\u011b vypsat odkaz lze pou\u017e\u00edt metoda <em>link_to<\/em>, kter\u00e1 v\u0161e pot\u0159ebn\u00e9 obstar\u00e1 za n\u00e1s.<\/p>\n<pre>\r\nlink_to 'Odstranit z\u00e1znam', {:controller => 'groups',\r\n:action => 'delete', :id => group}, :confirm => 'Jste si jist\u00fd?'\r\n<\/pre>\n<p>Je-li kladen p\u0159i v\u00fdvoji pat\u0159i\u010dn\u00fd d\u016fraz na&nbsp;to, aby aplikace byla u\u017eivatelsky p\u0159\u00edv\u011btiv\u00e1, pak jsou vhodn\u00fdmi pomocn\u00edky metody, kter\u00e9 zav\u00e1d\u00ed do&nbsp;Ruby on Rails ur\u010dit\u00fd n\u00e1vrhov\u00fd vzor vedouc\u00ed k&nbsp;v\u011bt\u0161\u00edmu polid\u0161t\u011bn\u00ed v\u00fdpis\u016f dat. Na&nbsp;u\u017eivatele p\u016fsob\u00ed v\u00fdsledn\u00fd syst\u00e9m m\u00e9n\u011b stresuj\u00edc\u00edm dojmem a&nbsp;lid\u00e9 maj\u00ed pocit, \u017ee&nbsp;aplikace pak \"mluv\u00ed\" v\u00edce jejich jazykem a&nbsp;nekomunikuje s&nbsp;nimi jen prost\u0159ednictv\u00edm \u010d\u00edseln\u00fdch \u00fadaj\u016f.<\/p>\n<pre>\r\ntime_ago_in_words(5.minute.ago)\r\n=> \"5 minutami\"\r\n\r\nnumber_to_currency(999)\r\n=> \"999,00 K\u010d\"\r\n<\/pre>\n<p>T\u011bchto zabudovan\u00fdch metod, kter\u00e9 Ruby on Rails nab\u00edz\u00ed, je opravdu velik\u00e9 mno\u017estv\u00ed. V\u0161echny jsou ale <a href=\"http:\/\/api.rubyonrails.org\/\">dob\u0159e zdokumentovan\u00e9<\/a>. Nicm\u00e9n\u011b i&nbsp;p\u0159es jejich mno\u017estv\u00ed se \u010dasto st\u00e1v\u00e1, \u017ee&nbsp;je nutn\u00e9 nadefinovat dal\u0161\u00ed pomocnou metodu, kter\u00e1 se postar\u00e1 nap\u0159\u00edklad o&nbsp;vykreslen\u00ed hlavn\u00edho menu na&nbsp;webov\u00e9 str\u00e1nce. I&nbsp;s&nbsp;t\u00edmto auto\u0159i po\u010d\u00edtali a&nbsp;je tak mo\u017en\u00e9 do&nbsp;p\u0159edem p\u0159ipraven\u00e9 adres\u00e1\u0159ov\u00e9 struktury ukl\u00e1dat nov\u00e9 soubory s&nbsp;vlastn\u00edmi metodami.<\/p>\n<h3>Gener\u00e1tory<\/h3>\n<p>Velice zaj\u00edmav\u00fdmi n\u00e1stroji jsou takzvan\u00e9 <em>gener\u00e1tory k\u00f3du<\/em>. Gener\u00e1tory zaujmou p\u0159ev\u00e1\u017en\u011b v\u00fdvoj\u00e1\u0159e seznamuj\u00edc\u00ed se prvn\u011b s&nbsp;t\u00edmto frameworkem. Ty n\u00e1m pomohou p\u0159i vytv\u00e1\u0159en\u00ed nov\u00fdch model\u016f, pohled\u016f a&nbsp;jin\u00fdch sou\u010d\u00e1st\u00ed aplikace. Aby v\u00fdvoj\u00e1\u0159i nemuseli ps\u00e1t v\u0161echno ru\u010dn\u011b, vygeneruj\u00ed pomoc\u00ed nich z\u00e1kladn\u00ed strukturu automaticky a&nbsp;pak pouze upravuj\u00ed p\u0159\u00edpadn\u00e9 detaily. Gener\u00e1tor\u016f je v&nbsp;syst\u00e9mu n\u011bkolik. Naprost\u00ed za\u010d\u00e1te\u010dn\u00edci uv\u00edtaj\u00ed zejm\u00e9na <em>scaffold gener\u00e1tory<\/em>, kter\u00e9 um\u00ed sestavit k&nbsp;vybran\u00e9 datab\u00e1zov\u00e9 tabulce formul\u00e1\u0159e pro zakl\u00e1d\u00e1n\u00ed, editaci a&nbsp;maz\u00e1n\u00ed dat. Postar\u00e1 se i&nbsp;o&nbsp;vytvo\u0159en\u00ed pot\u0159ebn\u00e9 tabulky pro v\u00fdpis dat. Scaffold automaticky vyrob\u00ed prvky formul\u00e1\u0159e podle typ\u016f sloupc\u016f v&nbsp;datab\u00e1zov\u00e9 tabulce. Tak\u017ee z&nbsp;typu <em>VARCHAR<\/em> se stane ve&nbsp;formul\u00e1\u0159i oby\u010dejn\u00e9 textov\u00e9 pole, z&nbsp;typu <em>BOOLEAN<\/em> se stane naopak za\u0161krt\u00e1vac\u00ed formul\u00e1\u0159ov\u00e9 pole.<\/p>\n<h3>Pou\u017eit\u00ed datab\u00e1ze<\/h3>\n<p>Pro samotn\u00fd p\u0159\u00edstup k&nbsp;datab\u00e1zi je zde pou\u017eit princip ORM (Object-relational mapping). Ve&nbsp;skute\u010dnosti to pak znamen\u00e1, \u017ee&nbsp;v\u0161echny z\u00e1znamy rela\u010dn\u00ed datab\u00e1ze jsou mapov\u00e1ny na&nbsp;objekty. \u0158\u00e1dky se p\u0159evedou na&nbsp;instance objekt\u016f a&nbsp;sloupce na&nbsp;jejich atributy. Vytvo\u0159en\u00ed nov\u00e9ho z\u00e1znamu lze demonstrovat na&nbsp;jednoduch\u00e9 uk\u00e1zce, kter\u00e1 ulo\u017e\u00ed do&nbsp;datab\u00e1ze novou osobu.<\/p>\n<pre>\r\np = Person.new :first_name => 'Martin', :sure_name => 'Pe\u0161out'\r\np.comment = 'autor odborn\u00e9ho \u010dl\u00e1nku'\r\np.save\r\n<\/pre>\n<p>D\u00edky principu ORM se pracuje v&nbsp;aplikaci pouze s&nbsp;objekty a&nbsp;nen\u00ed nutn\u00e9 ps\u00e1t konkr\u00e9tn\u00ed SQL dotazy pro ulo\u017een\u00ed pot\u0159ebn\u00fdch dat. Program\u00e1tor nen\u00ed v\u016fbec omezen pou\u017eitou datab\u00e1z\u00ed a&nbsp;kdy\u017e se rozhodne v&nbsp;budoucnu pou\u017e\u00edt m\u00edsto MySQL nap\u0159\u00edklad datab\u00e1zi PostgreSQL, zam\u011bn\u00ed pouze p\u0159\u00edslu\u0161n\u00fd adapt\u00e9r v&nbsp;konfigura\u010dn\u00edch souborech a&nbsp;nemus\u00ed kv\u016fli takov\u00e9to zm\u011bn\u011b p\u0159episovat zdrojov\u00e9 k\u00f3dy. V&nbsp;sou\u010dasn\u00e9 dob\u011b jsou podporov\u00e1ny n\u00e1sleduj\u00edc\u00ed datab\u00e1ze:<\/p>\n<ul>\n<li>MySQL<\/li>\n<li>PostgreSQL<\/li>\n<li>SQLite<\/li>\n<li>SQL Server<\/li>\n<li>IBM DB2<\/li>\n<li>Informix<\/li>\n<li>Oracle<\/li>\n<li>Firebird\/Interbase<\/li>\n<li>LDAP<\/li>\n<li>SybaseASA (Sybase Adaptive Server Anywhere aka SQL Anywhere Studio)<\/li>\n<li>MonetDB<\/li>\n<\/ul>\n<p>P\u0159i vyu\u017e\u00edv\u00e1n\u00ed datab\u00e1z\u00ed narazil z\u0159ejm\u011b ka\u017ed\u00fd v\u00fdvoj\u00e1\u0159 na&nbsp;probl\u00e9m, jak udr\u017eet p\u0159ehled ve&nbsp;v\u0161ech \u00faprav\u00e1ch, kter\u00e9 nad datab\u00e1zov\u00fdm sch\u00e9matem prov\u00e1d\u00ed. Za t\u00edmto \u00fa\u010delem byly vytvo\u0159eny v&nbsp;Ruby on Rails takzvan\u00e9 <em>migrace<\/em>. Ty n\u00e1m umo\u017e\u0148uj\u00ed popsat pot\u0159ebn\u00e9 zm\u011bny v&nbsp;datab\u00e1zov\u00e9m sch\u00e9matu a&nbsp;dokonce se vracet v&nbsp;t\u011bchto \u00faprav\u00e1ch zp\u011bt. Proto\u017ee se jedn\u00e1 pouze o&nbsp;textov\u00e9 soubory, je ji\u017e velice snadn\u00e9 tyto z\u00e1znamy p\u0159en\u00e9st nap\u0159\u00edklad do&nbsp;Subversion nebo GIT, tj. syst\u00e9mu pro spr\u00e1vu verz\u00ed zdrojov\u00fdch k\u00f3d\u016f. Ka\u017ed\u00e1 migrace se skl\u00e1d\u00e1 ze dvou metod: <em>up<\/em> a&nbsp;<em>down<\/em>. V\u00fdvoj\u00e1\u0159 tak dostane mo\u017enost v&nbsp;nich definovat akce, kter\u00e9 se provedou p\u0159i proch\u00e1zen\u00ed historie jednotliv\u00fdch \u00faprav datab\u00e1zov\u00e9ho sch\u00e9matu. D\u00e1le je pro existenci migrac\u00ed v\u00fdznamn\u00e1 datab\u00e1zov\u00e1 tabulka <em>schema_info<\/em> s&nbsp;jedn\u00edm sloupcem typu <em>INTEGER<\/em>. Zde se eviduj\u00ed identifik\u00e1tory ji\u017e proveden\u00fdch \u00faprav (migrac\u00ed). T\u0159\u00eddy migrac\u00ed jsou ulo\u017eeny ve&nbsp;speci\u00e1ln\u00edch souborech, kter\u00e9 jsou pojmenov\u00e1ny podle vzoru <em>xxx_nazev_migrace.rb<\/em>, kde xxx je \u010d\u00edslo vyjad\u0159uj\u00edc\u00ed p\u0159esn\u00fd \u010das vzniku. N\u00e1sleduj\u00edc\u00ed p\u0159\u00edklad ukazuje postup p\u0159i vytvo\u0159en\u00ed tabulky <em>item<\/em>:<\/p>\n<pre>\r\nclass CreateItems < ActiveRecord::Migration\r\ndef self.up\r\ncreate_table :items do |t|\r\nend\r\nend\r\ndef self.down\r\ndrop_table :items\r\nend\r\nend\r\n<\/pre>\n<p>Aplikace v Ruby on Rails m\u016f\u017ee b\u00fdt spu\u0161t\u011bna v jednom z n\u011bkolika b\u011bhov\u00fdch prost\u0159ed\u00ed, kter\u00e9 pak ovliv\u0148uj\u00ed chov\u00e1n\u00ed jednotliv\u00fdch \u010d\u00e1st\u00ed frameworku. Standardn\u011b jsou dostupn\u00e1 t\u0159i prost\u0159ed\u00ed:<\/p>\n<ul>\n<li><strong>V\u00fdvojov\u00e9<\/strong> - toto prost\u0159ed\u00ed slou\u017e\u00ed pro v\u00fdvoj aplikace<\/li>\n<li><strong>Testovac\u00ed<\/strong> - slou\u017e\u00ed pro spu\u0161t\u011bn\u00ed automatick\u00fdch jednotkov\u00fdch a integra\u010dn\u00edch test\u016f<\/li>\n<li><strong>Produk\u010dn\u00ed<\/strong> - v tomto prost\u0159ed\u00ed je spou\u0161t\u011bna aplikace do ostr\u00e9ho provozu<\/li>\n<\/ul>\n<p>P\u0159ipojen\u00ed k datab\u00e1zi se nastavuje odd\u011blen\u011b pro ka\u017ed\u00e9 prost\u0159ed\u00ed zvl\u00e1\u0161\u0165. Pro v\u00fdvoj\u00e1\u0159e to znamen\u00e1, \u017ee tak lze vyu\u017e\u00edt odd\u011blen\u00e9 datab\u00e1ze. Je mo\u017en\u00e9 tak snadno m\u00edt testovac\u00ed data zvl\u00e1\u0161\u0165 od dat slou\u017e\u00edc\u00edch k ostr\u00e9mu provozu na webu. Aplikace se pak v p\u0159\u00edpad\u011b pot\u0159eby spust\u00ed pouze v po\u017eadovan\u00e9m re\u017eimu.<\/p>\n<p>I p\u0159i samotn\u00e9m n\u00e1vrhu datab\u00e1zov\u00e9ho sch\u00e9matu lze vyu\u017e\u00edt \u0159adu u\u017eite\u010dn\u00fdch konvenc\u00ed. Pro n\u00e1zvy tabulek se b\u011b\u017en\u011b pou\u017e\u00edvaj\u00ed anglick\u00e9 n\u00e1zvy objekt\u016f, kter\u00e9 se reprezentuj\u00ed v mno\u017en\u00e9m \u010d\u00edsle a mal\u00fdmi p\u00edsmeny. Pokud jsou n\u00e1zvy v\u00edceslovn\u00e9, odd\u011bluj\u00ed se podtr\u017e\u00edtkem. P\u0159\u00edklad lze vid\u011bt na n\u00e1sleduj\u00edc\u00ed tabulce.<\/p>\n\n<table id=\"tablepress-1\" class=\"tablepress tablepress-id-1\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">N\u00e1zev modelu<\/th><th class=\"column-2\">N\u00e1zev tabulky<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">Monkey<\/td><td class=\"column-2\">monkeys<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">Octopus<\/td><td class=\"column-2\">octopi<\/td>\n<\/tr>\n<tr class=\"row-4\">\n\t<td class=\"column-1\">Customer<\/td><td class=\"column-2\">customers<\/td>\n<\/tr>\n<tr class=\"row-5\">\n\t<td class=\"column-1\">Monkey Hunter<\/td><td class=\"column-2\">monkey_hunters<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-1 from cache -->\n<p>Rails o\u010dek\u00e1v\u00e1 n\u00e1zev sloupce prim\u00e1rn\u00edho kl\u00ed\u010de <em>id<\/em>. Ciz\u00ed kl\u00ed\u010de jsou ve tvaru <em>{jednotn\u00e9 \u010d\u00edslo ciz\u00ed tabulky}_id<\/em>. Samoz\u0159ejm\u011b se jedn\u00e1 jen o \u0159adu doporu\u010den\u00ed, jak navrhovat datab\u00e1zov\u00e9 sch\u00e9ma. Nap\u0159\u00edklad n\u00e1zev sloupce prim\u00e1rn\u00edho nebo ciz\u00edho kl\u00ed\u010de m\u016f\u017ee b\u00fdt i pojmenov\u00e1n jinak. Rails pouze \u0159\u00edk\u00e1, \u017ee pokud se vyu\u017eije t\u011bchto pravidel, usnadn\u00ed se t\u00edm budouc\u00ed pr\u00e1ce.<\/p>\n\n<table id=\"tablepress-2\" class=\"tablepress tablepress-id-2\">\n<thead>\n<tr class=\"row-1\">\n\t<th class=\"column-1\">N\u00e1zev tabulky<\/th><th class=\"column-2\">Ciz\u00ed kl\u00ed\u010d<\/th>\n<\/tr>\n<\/thead>\n<tbody class=\"row-striping row-hover\">\n<tr class=\"row-2\">\n\t<td class=\"column-1\">monkeys<\/td><td class=\"column-2\">monkey_id<\/td>\n<\/tr>\n<tr class=\"row-3\">\n\t<td class=\"column-1\">octopi<\/td><td class=\"column-2\">octopus_id<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<!-- #tablepress-2 from cache -->\n<p>Program\u00e1torsk\u00e1 p\u0159\u00edv\u011btivost jde je\u0161t\u011b d\u00e1l. P\u0159i pou\u017eit\u00ed speci\u00e1ln\u00edch n\u00e1zv\u016f sloupc\u016f tabulek je mo\u017en\u00e9 doc\u00edlit tak\u00e9 toho, \u017ee se budou automaticky vypl\u0148ovat n\u011bkter\u00e9 \u010dasov\u00e9 \u00fadaje. Sloupec s n\u00e1zvem <em>created_on<\/em> bude automaticky vypln\u011bn aktu\u00e1ln\u00edm \u010dasem p\u0159i vytvo\u0159en\u00ed nov\u00e9ho z\u00e1znamu v tabulce. Ve sloupci <em>updated_on<\/em> se zas automaticky vypln\u00ed \u010das posledn\u00ed editace p\u0159\u00edslu\u0161n\u00e9ho z\u00e1znamu. Napln\u011bn\u00ed hodnotami tak za v\u00fdvoj\u00e1\u0159e obstar\u00e1 sama aplikace.<\/p>\n<h3>Tvorba interaktivn\u00edch aplikac\u00ed<\/h3>\n<p>V prvn\u00edch n\u011bkolika letech internetu byly webov\u00e9 aplikace v porovn\u00e1n\u00ed se stoln\u00edmi aplikacemi zna\u010dn\u011b pomal\u00e9 a neohraban\u00e9. Lid\u00e9 m\u011bli r\u00e1di webov\u00e9 aplikace p\u0159ev\u00e1\u017en\u011b proto, \u017ee byly dostupn\u00e9 kdekoliv, kde bylo dostupn\u00e9 p\u0159ipojen\u00ed k internetu. Pot\u00e9 firma Microsoft vytvo\u0159ila tzv. XMLHttpRequest pro sv\u016fj internetov\u00fd prohl\u00ed\u017ee\u010d Internet Explorer 5. Umo\u017enila t\u00edm skript\u016fm na zobrazen\u00e9 str\u00e1nce komunikovat s webov\u00fdm serverem v pozad\u00ed bez nutnosti na\u010d\u00edt\u00e1n\u00ed nov\u00e9 webov\u00e9 str\u00e1nky. V\u00fdvoj\u00e1\u0159 tak m\u016f\u017ee vytvo\u0159it v\u00edce interaktivn\u00ed aplikace. Brzo po zve\u0159ejn\u011bn\u00ed tohoto \u0159e\u0161en\u00ed implementovala i Mozilla a Opera XMLHttpRequest do sv\u00fdch prohl\u00ed\u017ee\u010d\u016f. Zprvu nebyla tato forma komunikace v\u016fbec roz\u0161\u00ed\u0159en\u00e1. Do pov\u011bdom\u00ed v\u011bt\u0161\u00edho mno\u017estv\u00ed lid\u00ed ji dostala a\u017e spole\u010dnost Google, kter\u00e9 se poda\u0159ilo vyvinout s\u00e9rii aplikac\u00ed komunikuj\u00edc\u00edch pr\u00e1v\u011b prost\u0159ednictv\u00edm XMLHttpRequest. Nejzn\u00e1m\u011bj\u0161\u00ed je asi <a href=\"http:\/\/maps.google.com\/\">Google Maps<\/a>, poskytuj\u00edc\u00ed n\u00e1v\u0161t\u011bvn\u00edk\u016fm p\u0159edstavu, \u017ee jsou schopni p\u0159etahovat nekone\u010dn\u011b rozs\u00e1hlou mapu v okn\u011b sv\u00e9ho prohl\u00ed\u017ee\u010de. Vyu\u017e\u00edv\u00e1n\u00ed XHLHttpRequestu je nyn\u00ed zn\u00e1mo pod jednoduch\u00fdm n\u00e1zvem AJAX (Asynchronous JavaScript and XML).<\/p>\n<p>Ruby on Rails m\u00e1 jednoduch\u00fd, konzistentn\u00ed model, jak implementovat AJAX. Pokud se v prohl\u00ed\u017ee\u010di zobraz\u00ed \u00favodn\u00ed webov\u00e1 str\u00e1nka, lze pomoc\u00ed jin\u00e9 u\u017eivatelsk\u00e9 akce p\u0159ej\u00edt na novou internetovou str\u00e1nku (klasick\u00e9 webov\u00e9 aplikace) a nebo spustit n\u011bkterou AJAX operaci:<\/p>\n<ol>\n<li>Do\u0161lo ke spou\u0161t\u011bc\u00ed akci. Ta m\u016f\u017ee nastat nap\u0159\u00edklad kliknut\u00edm na ur\u010dit\u00fd odkaz nebo tla\u010d\u00edtko, u\u017eivatel mohl zm\u011bnit data ve formul\u00e1\u0159i a nebo do\u0161lo ke spu\u0161t\u011bn\u00ed automatick\u00e9 periodick\u00e9 akce.<\/li>\n<li>Data asociovan\u00e1 se spou\u0161t\u011bc\u00ed ud\u00e1lost\u00ed jsou zasl\u00e1na asynchronn\u011b na server prost\u0159ednictv\u00edm XMLHttpRequest, kde se o n\u011b postar\u00e1 p\u0159\u00edslu\u0161n\u00e1 akce.<\/li>\n<li>Obsluha dan\u00e9 akce na stran\u011b serveru provede program\u00e1torem ur\u010den\u00e9 operace v z\u00e1vislosti na poskytnut\u00fdch datech a jako v\u00fdsledek vr\u00e1t\u00ed p\u0159\u00edslu\u0161n\u00fd fragment HTML k\u00f3du.<\/li>\n<li>Skripty na stran\u011b klienta obdr\u017e\u00ed fragment HTML k\u00f3du a pou\u017eij\u00ed ho k aktualizaci specifick\u00e9 \u010d\u00e1sti zobrazen\u00e9 HTML str\u00e1nky.<\/li>\n<\/ol>\n<p>Aby bylo pou\u017e\u00edv\u00e1n\u00ed t\u00e9to technologie co nejsnaz\u0161\u00ed, nab\u00edz\u00ed Ruby on Rails v\u00fdvoj\u00e1\u0159\u016fm n\u011bkolik pomocn\u00fdch metod, kter\u00e9 za n\u011b vygeneruj\u00ed ve zdrojov\u00e9m k\u00f3du v\u0161e pot\u0159ebn\u00e9. Program\u00e1tor zavol\u00e1 pouze vhodn\u011b vybranou metodu. Pro uk\u00e1zku zde bude zm\u00edn\u011bna AJAX alternativa ke klasick\u00e9 pomocn\u00e9 metod\u011b pro zobrazen\u00ed odkazu.<\/p>\n<pre>\r\nlink_to('Odstranit z\u00e1znam', :url => {:controller => 'groups',\r\n:action => 'delete', :id => group}, :remote => true, :confirm => 'Jste si jist\u00fd?')\r\n<\/pre>\n<h3>Podpora v\u00edce jazyk\u016f<\/h3>\n<p>Zejm\u00e9na u v\u011bt\u0161\u00edch projekt\u016f je \u010dasto nutn\u00e9 \u0159e\u0161it situace, jak efektivn\u011b naprogramovat aplikaci s podporou v\u00edce jazyk\u016f. Ruby on Rails od verze 2.2 poskytuje snadn\u00fd zp\u016fsob, jak toho doc\u00edlit. V r\u00e1mci v\u00edcejazy\u010dn\u00e9 podpory se hovo\u0159\u00ed o dvou v\u00fdznamn\u00fdch procesech. Proces <em>internacionalizace<\/em> znamen\u00e1, \u017ee se odd\u011bluj\u00ed v\u0161echny p\u0159ekl\u00e1dan\u00e9 textov\u00e9 \u0159et\u011bzce a dal\u0161\u00ed kousky k\u00f3du (jako m\u011bnu a datum) mimo na\u0161i aplikaci. Proces <em>lokalizace<\/em> pak znamen\u00e1 samotn\u00e9 zaji\u0161t\u011bn\u00ed p\u0159eklad\u016f a m\u00edstn\u00edch form\u00e1t\u016f (ka\u017ed\u00fd st\u00e1t m\u00e1 jinou m\u011bnu nebo jin\u00fd zp\u016fsob z\u00e1pisu pro datum) pro takov\u00e9to kousky textu. Odd\u011blen\u00e9 p\u0159eklady jsou pot\u00e9 um\u00edst\u011bny do speci\u00e1ln\u00edch textov\u00fdch soubor\u016f. Ka\u017ed\u00fd text je v n\u011bm ozna\u010den unik\u00e1tn\u00edm kl\u00ed\u010dem, d\u00edky kter\u00e9mu lze poznat v pohledech, jak\u00fd popisek se m\u00e1 pou\u017e\u00edt. Jednoduch\u00fd soubor s na\u0161\u00edm p\u0159elo\u017een\u00fdm textem pro anglick\u00fd jazyk m\u016f\u017ee vypadat t\u0159eba n\u00e1sledovn\u011b:<\/p>\n<pre>\r\nen:\r\nhello: \"Hello world\"\r\n<\/pre>\n<p>V jin\u00e9m souboru bude ulo\u017een stejn\u00fd p\u0159eklad, ale pro \u010desk\u00fd jazyk.<\/p>\n<pre>\r\ncs:\r\nhello: \"Ahoj sv\u011bte\"\r\n<\/pre>\n<p>Pro vyps\u00e1n\u00ed na\u0161eho textu v pohledu, sta\u010d\u00ed napsat n\u00e1sleduj\u00edc\u00ed:<\/p>\n<pre>\r\nt :hello\r\n<\/pre>\n<p>Aplikace pak pomoc\u00ed jednoduch\u00fdch p\u0159\u00edkaz\u016f rozhodne, jak\u00fd jazyk se m\u00e1 aktu\u00e1ln\u011b pou\u017e\u00edt. A podle toho se vyp\u00ed\u0161e p\u0159\u00edslu\u0161n\u00fd anglick\u00fd nebo \u010desk\u00fd popisek. Toto je samoz\u0159ejm\u011b jen z\u00e1kladn\u00ed uk\u00e1zka pou\u017eit\u00ed p\u0159eklad\u016f v Ruby on Rails. Je mo\u017en\u00e9 vyu\u017e\u00edvat i slo\u017eit\u011bj\u0161\u00edch metod. P\u0159ekl\u00e1dat lze jednotliv\u00e9 modely, n\u00e1zvy atribut\u016f, rozli\u0161ovat jednotn\u00e9 a mno\u017en\u00e9 tvary slov apod.<\/p>\n<h3>Vylep\u0161en\u00ed aplikace pomoc\u00ed plugin\u016f<\/h3>\n<p>Dal\u0161\u00ed silnou str\u00e1nkou Ruby on Rails je zp\u016fsob, jak\u00fdm lze snadno roz\u0161i\u0159ovat poskytovan\u00e9 funkce pomoc\u00ed <em>plugin\u016f<\/em>. Jedn\u00e1 se o extern\u00ed knihovny. Jejich pou\u017eit\u00ed \u0161et\u0159\u00ed spoustu \u010dasu, proto\u017ee funk\u010dnost, kterou pot\u0159ebujete, napsal u\u017e n\u011bkdo p\u0159ed v\u00e1mi a mo\u017en\u00e1 dokonce i l\u00e9pe, ne\u017e byste to ud\u011blali vy. U hojn\u011b pou\u017e\u00edvan\u00fdch plugin\u016f je nav\u00edc jist\u011bj\u0161\u00ed, \u017ee bude odstran\u011bna v\u011bt\u0161ina chyb. Existuje jich hned cel\u00e1 \u0159ada, od t\u011bch \u0159e\u0161\u00edc\u00edch obecn\u00e9 probl\u00e9my t\u00e9m\u011b\u0159 ka\u017ed\u00e9 aplikace po pluginy, kter\u00e9 jsou ur\u010den\u00e9 pro specifick\u00e9 p\u0159\u00edpady. Snadno tak lze na\u0161e programy roz\u0161\u00ed\u0159it o mo\u017enost pr\u00e1ce s obr\u00e1zky nebo umo\u017enit jednotliv\u00fdm u\u017eivatel\u016fm p\u0159ihl\u00e1\u0161en\u00ed do syst\u00e9mu a p\u0159i\u0159azen\u00ed pot\u0159ebn\u00fdch pr\u00e1v. Pro p\u0159\u00edpadn\u00e9 z\u00e1jemce doporu\u010duji webovou str\u00e1nku <a href=\"http:\/\/ruby-toolbox.com\/\">The Ruby Toolbox<\/a>, kter\u00e1 poskytuje velice p\u011bkn\u00fd p\u0159ehled nejpou\u017e\u00edvan\u011bj\u0161\u00edch plugin\u016f.<\/p>\n<h3>Testov\u00e1n\u00ed<\/h3>\n<p>Posledn\u00ed vlastnost, kter\u00e1 bude v tomto \u010dl\u00e1nku zm\u00edn\u011bna, je testov\u00e1n\u00ed. Vytv\u00e1\u0159\u00edme-li webovou aplikaci, m\u00e1me v\u017edy ur\u010ditou p\u0159edstavu, jak by se m\u011bla chovat. \u010cas od \u010dasu pot\u0159ebujeme n\u011bjakou \u010d\u00e1st upravit nebo p\u0159idat nov\u00e9 funkce. Jak se syst\u00e9m postupn\u011b rozr\u016fst\u00e1, je \u010d\u00edm d\u00e1l v\u00edc obt\u00ed\u017en\u011bj\u0161\u00ed sledovat, jestli se v\u0161echny \u010d\u00e1sti chovaj\u00ed po\u0159\u00e1d stejn\u011b. Proces v\u00fdvoje se proto neobejde bez testov\u00e1n\u00ed. Na proveden\u00e9 \u00fapravy nap\u00ed\u0161e program\u00e1tor vlastn\u00ed sadu test\u016f, a pokud v\u0161echny kontroly projdou, dost\u00e1v\u00e1 tak v\u011bt\u0161\u00ed z\u00e1ruku, \u017ee do syst\u00e9mu n\u011bkdo nezanesl chyby. Samoz\u0159ejm\u011b v\u0161e z\u00e1le\u017e\u00ed na tom, s jakou d\u016fslednost\u00ed se testy p\u00ed\u0161\u00ed. Testov\u00e1n\u00ed v Ruby on Rails se d\u011bl\u00ed do dvou \u010d\u00e1st\u00ed:<\/p>\n<ul>\n<li>Testy model\u016f (Unit tests)<\/li>\n<li>Testy \u0159adi\u010d\u016f (Functional tests)<\/li>\n<\/ul>\n<p>Proces testov\u00e1n\u00ed pak prob\u00edh\u00e1 pomoc\u00ed <em>tvrzen\u00ed<\/em>. Jedn\u00e1 se o speci\u00e1ln\u00ed metody, kter\u00e9 zkontroluj\u00ed vybran\u00fd k\u00f3d. Po spu\u0161t\u011bn\u00ed jsou vyhodnoceny bu\u010f jako pravda nebo nepravda, podle toho jestli se poda\u0159ilo pot\u0159ebn\u00fd k\u00f3d prov\u011b\u0159it.<\/p>\n<h2>Z\u00e1v\u011brem<\/h2>\n<p>O Ruby on Rails by se dalo dlouze rozepisovat. Vlastnost\u00ed, kter\u00fdma se tento framework m\u016f\u017ee chlubit, je samoz\u0159ejm\u011b v\u00edce. Sna\u017eil jsem se trochu p\u0159ibl\u00ed\u017eit ty z nich, kter\u00e9 m\u011b samotn\u00e9ho zaujaly, kdy\u017e jsem se za\u010dal seznamovat s t\u00edmto programovac\u00edm jazykem.<\/p>\n<h2>Zdroje a odkazy na podrobn\u011bj\u0161\u00ed informace<\/h2>\n<ul>\n<li>Pe\u0161out, M.: Diplomov\u00e1 pr\u00e1ce Webov\u00e1 aplikace pro \u0159\u00edzen\u00ed projektu a spr\u00e1vu \u00faloh, jaro 2009<\/li>\n<li>Ofici\u00e1ln\u00ed pr\u016fvodce Ruby on Rails, <a href=\"http:\/\/guides.rubyonrails.cz\/\">http:\/\/guides.rubyonrails.cz\/<\/a>, \u00fanor 2011<\/li>\n<li>Holzner, S.: Za\u010d\u00edn\u00e1me programovat v Ruby on Rails, Computer Press, kv\u011bten 2007<\/li>\n<li>Thomas, D. a Hansson, D.: Agile Web Development with Rails, The Pragmatic Progra-mmers LLC, prosinec 2005<\/li>\n<li>Ruby on Rails: Rails Internationalization (I18n) API, <a href=\"http:\/\/guides.rubyonrails.org\/i18n.html\">http:\/\/guides.rubyonrails.org\/i18n.html<\/a>, listopad 2008<\/li>\n<li>TIOBE Software BV: The Ruby Programming Language, <a href=\"http:\/\/www.tiobe.com\/index.php\/paperinfo\/tpci\/Ruby.html\">http:\/\/www.tiobe.com\/index.php\/paperinfo\/tpci\/Ruby.html<\/a>, duben 2009<\/li>\n<li>Root.cz: Seri\u00e1l Ruby on Rails, <a href=\"http:\/\/www.root.cz\/serialy\/ruby-on-rails\/\">http:\/\/www.root.cz\/serialy\/ruby-on-rails\/<\/a>, b\u0159ezen 2006<\/li>\n<li>Ruby on Rails: Rails Wiki, <a href=\"http:\/\/wiki.rubyonrails.org\/\">http:\/\/wiki.rubyonrails.org\/<\/a>, kv\u011bten 2009<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Kdy\u017e jsem p\u0159ed necel\u00fdm m\u011bs\u00edcem za\u010dal ps\u00e1t tento \u010dl\u00e1nek, tak jsem si \u0159\u00edkal, \u017ee&nbsp;bych r\u00e1d v\u0161em sv\u00fdm \u010dten\u00e1\u0159\u016fm p\u0159ibl\u00ed\u017eil n\u00e1stroj, kter\u00fd dennodenn\u011b pou\u017e\u00edv\u00e1m ve&nbsp;sv\u00e9m zam\u011bstn\u00e1n\u00ed. Jednalo se o&nbsp;webov\u00fd framework Ruby on Rails. P\u016fvodn\u011b jsem ne\u010dekal, \u017ee&nbsp;budu nucen\u00fd kv\u016fli rozsahu cel\u00fd \u010dl\u00e1nek rozd\u011blit do&nbsp;dvou d\u00edl\u016f. Prvn\u00ed \u010d\u00e1st se soust\u0159edila na&nbsp;samotn\u00fd z\u00e1klad a&nbsp;to na&nbsp;programovac\u00ed jazyk Ruby. Tento \u010dl\u00e1nek je dal\u0161\u00edm pokra\u010dov\u00e1n\u00edm a&nbsp;je v\u011bnov\u00e1n hlavn\u00edm vlastnostem frameworku Ruby on Rails, kter\u00e9 p\u0159\u00edpadn\u00e9 z\u00e1jemce nejv\u00edce zaj\u00edmaj\u00ed.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[71],"tags":[11,12],"class_list":["post-282","post","type-post","status-publish","format-standard","hentry","category-vyvoj","tag-ruby","tag-ruby-on-rails"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\" \/>\n<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog\" \/>\n<meta property=\"og:description\" content=\"Kdy\u017e jsem p\u0159ed necel\u00fdm m\u011bs\u00edcem za\u010dal ps\u00e1t tento \u010dl\u00e1nek, tak jsem si \u0159\u00edkal, \u017ee&nbsp;bych r\u00e1d v\u0161em sv\u00fdm \u010dten\u00e1\u0159\u016fm p\u0159ibl\u00ed\u017eil n\u00e1stroj, kter\u00fd dennodenn\u011b pou\u017e\u00edv\u00e1m ve&nbsp;sv\u00e9m zam\u011bstn\u00e1n\u00ed. Jednalo se o&nbsp;webov\u00fd framework Ruby on Rails. P\u016fvodn\u011b jsem ne\u010dekal, \u017ee&nbsp;budu nucen\u00fd kv\u016fli rozsahu cel\u00fd \u010dl\u00e1nek rozd\u011blit do&nbsp;dvou d\u00edl\u016f. Prvn\u00ed \u010d\u00e1st se soust\u0159edila na&nbsp;samotn\u00fd z\u00e1klad a&nbsp;to na&nbsp;programovac\u00ed jazyk Ruby. Tento \u010dl\u00e1nek je dal\u0161\u00edm pokra\u010dov\u00e1n\u00edm a&nbsp;je v\u011bnov\u00e1n hlavn\u00edm vlastnostem frameworku Ruby on Rails, kter\u00e9 p\u0159\u00edpadn\u00e9 z\u00e1jemce nejv\u00edce zaj\u00edmaj\u00ed.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\" \/>\n<meta property=\"og:site_name\" content=\"igloonet blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/igloonet\" \/>\n<meta property=\"article:published_time\" content=\"2011-02-24T11:11:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-08-11T20:00:52+00:00\" \/>\n<meta name=\"author\" content=\"Martin Pe\u0161out\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@martinpesout\" \/>\n<meta name=\"twitter:site\" content=\"@igloonet\" \/>\n<meta name=\"twitter:label1\" content=\"Napsal(a)\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Pe\u0161out\" \/>\n\t<meta name=\"twitter:label2\" content=\"Odhadovan\u00e1 doba \u010dten\u00ed\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\"},\"author\":{\"name\":\"Martin Pe\u0161out\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/8c731b61fb41d87a83ec347b7b85f17f\"},\"headline\":\"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s&nbsp;frameworkem Ruby on Rails (d\u00edl&nbsp;2.)\",\"datePublished\":\"2011-02-24T11:11:06+00:00\",\"dateModified\":\"2014-08-11T20:00:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\"},\"wordCount\":3267,\"commentCount\":6,\"publisher\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/#organization\"},\"keywords\":[\"Ruby\",\"Ruby on Rails\"],\"articleSection\":[\"V\u00fdvoj\"],\"inLanguage\":\"cs\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\",\"url\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\",\"name\":\"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog\",\"isPartOf\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/#website\"},\"datePublished\":\"2011-02-24T11:11:06+00:00\",\"dateModified\":\"2014-08-11T20:00:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#breadcrumb\"},\"inLanguage\":\"cs\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"V\u00fdvoj\",\"item\":\"https:\/\/igloonet.cz\/blog\/rubriky\/vyvoj\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s&nbsp;frameworkem Ruby on Rails (d\u00edl&nbsp;2.)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#website\",\"url\":\"https:\/\/igloonet.cz\/blog\/\",\"name\":\"igloonet blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/igloonet.cz\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"cs\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#organization\",\"name\":\"igloonet\",\"url\":\"https:\/\/igloonet.cz\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"cs\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/igloonet.cz\/blog\/wp-content\/uploads\/2015\/07\/RGB_LVPC_igloonet.png\",\"contentUrl\":\"https:\/\/igloonet.cz\/blog\/wp-content\/uploads\/2015\/07\/RGB_LVPC_igloonet.png\",\"width\":650,\"height\":465,\"caption\":\"igloonet\"},\"image\":{\"@id\":\"https:\/\/igloonet.cz\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/igloonet\",\"https:\/\/x.com\/igloonet\",\"https:\/\/instagram.com\/igloonet\/\",\"https:\/\/www.linkedin.com\/company\/igloonet\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/8c731b61fb41d87a83ec347b7b85f17f\",\"name\":\"Martin Pe\u0161out\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"cs\",\"@id\":\"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/032ee2fb90b35a9a451f30dac27d46caf09d97dea956a64a208abc47dfca3251?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/032ee2fb90b35a9a451f30dac27d46caf09d97dea956a64a208abc47dfca3251?s=96&d=retro&r=g\",\"caption\":\"Martin Pe\u0161out\"},\"description\":\"Jsem brn\u011bnsk\u00fd UI v\u00fdvoj\u00e1\u0159 p\u011bkn\u00e9ho frontendu. Od mali\u010dka si potrp\u00edm na detail, ale p\u0159itom kladu d\u016fraz na jednoduchost a p\u0159ehlednost. Zast\u00e1v\u00e1m n\u00e1zor, \u017ee jednodu\u0161\u0161\u00ed weby jsou ty nejkr\u00e1sn\u011bj\u0161\u00ed.\",\"sameAs\":[\"https:\/\/igloonet.cz\/vyvoj\",\"https:\/\/x.com\/martinpesout\"],\"url\":\"https:\/\/igloonet.cz\/blog\/author\/cheetah\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/","og_locale":"cs_CZ","og_type":"article","og_title":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog","og_description":"Kdy\u017e jsem p\u0159ed necel\u00fdm m\u011bs\u00edcem za\u010dal ps\u00e1t tento \u010dl\u00e1nek, tak jsem si \u0159\u00edkal, \u017ee&nbsp;bych r\u00e1d v\u0161em sv\u00fdm \u010dten\u00e1\u0159\u016fm p\u0159ibl\u00ed\u017eil n\u00e1stroj, kter\u00fd dennodenn\u011b pou\u017e\u00edv\u00e1m ve&nbsp;sv\u00e9m zam\u011bstn\u00e1n\u00ed. Jednalo se o&nbsp;webov\u00fd framework Ruby on Rails. P\u016fvodn\u011b jsem ne\u010dekal, \u017ee&nbsp;budu nucen\u00fd kv\u016fli rozsahu cel\u00fd \u010dl\u00e1nek rozd\u011blit do&nbsp;dvou d\u00edl\u016f. Prvn\u00ed \u010d\u00e1st se soust\u0159edila na&nbsp;samotn\u00fd z\u00e1klad a&nbsp;to na&nbsp;programovac\u00ed jazyk Ruby. Tento \u010dl\u00e1nek je dal\u0161\u00edm pokra\u010dov\u00e1n\u00edm a&nbsp;je v\u011bnov\u00e1n hlavn\u00edm vlastnostem frameworku Ruby on Rails, kter\u00e9 p\u0159\u00edpadn\u00e9 z\u00e1jemce nejv\u00edce zaj\u00edmaj\u00ed.","og_url":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/","og_site_name":"igloonet blog","article_publisher":"https:\/\/www.facebook.com\/igloonet","article_published_time":"2011-02-24T11:11:06+00:00","article_modified_time":"2014-08-11T20:00:52+00:00","author":"Martin Pe\u0161out","twitter_card":"summary_large_image","twitter_creator":"@martinpesout","twitter_site":"@igloonet","twitter_misc":{"Napsal(a)":"Martin Pe\u0161out","Odhadovan\u00e1 doba \u010dten\u00ed":"17 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#article","isPartOf":{"@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/"},"author":{"name":"Martin Pe\u0161out","@id":"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/8c731b61fb41d87a83ec347b7b85f17f"},"headline":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s&nbsp;frameworkem Ruby on Rails (d\u00edl&nbsp;2.)","datePublished":"2011-02-24T11:11:06+00:00","dateModified":"2014-08-11T20:00:52+00:00","mainEntityOfPage":{"@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/"},"wordCount":3267,"commentCount":6,"publisher":{"@id":"https:\/\/igloonet.cz\/blog\/#organization"},"keywords":["Ruby","Ruby on Rails"],"articleSection":["V\u00fdvoj"],"inLanguage":"cs","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/","url":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/","name":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s frameworkem Ruby on Rails (d\u00edl 2.) | igloonet blog","isPartOf":{"@id":"https:\/\/igloonet.cz\/blog\/#website"},"datePublished":"2011-02-24T11:11:06+00:00","dateModified":"2014-08-11T20:00:52+00:00","breadcrumb":{"@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#breadcrumb"},"inLanguage":"cs","potentialAction":[{"@type":"ReadAction","target":["https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/igloonet.cz\/blog\/zprijemnete-si-vyvoj-webovych-stranek-s-frameworkem-ruby-on-rails-dil-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"V\u00fdvoj","item":"https:\/\/igloonet.cz\/blog\/rubriky\/vyvoj\/"},{"@type":"ListItem","position":2,"name":"Zp\u0159\u00edjemn\u011bte si v\u00fdvoj webov\u00fdch str\u00e1nek s&nbsp;frameworkem Ruby on Rails (d\u00edl&nbsp;2.)"}]},{"@type":"WebSite","@id":"https:\/\/igloonet.cz\/blog\/#website","url":"https:\/\/igloonet.cz\/blog\/","name":"igloonet blog","description":"","publisher":{"@id":"https:\/\/igloonet.cz\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/igloonet.cz\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"cs"},{"@type":"Organization","@id":"https:\/\/igloonet.cz\/blog\/#organization","name":"igloonet","url":"https:\/\/igloonet.cz\/blog\/","logo":{"@type":"ImageObject","inLanguage":"cs","@id":"https:\/\/igloonet.cz\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/igloonet.cz\/blog\/wp-content\/uploads\/2015\/07\/RGB_LVPC_igloonet.png","contentUrl":"https:\/\/igloonet.cz\/blog\/wp-content\/uploads\/2015\/07\/RGB_LVPC_igloonet.png","width":650,"height":465,"caption":"igloonet"},"image":{"@id":"https:\/\/igloonet.cz\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/igloonet","https:\/\/x.com\/igloonet","https:\/\/instagram.com\/igloonet\/","https:\/\/www.linkedin.com\/company\/igloonet"]},{"@type":"Person","@id":"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/8c731b61fb41d87a83ec347b7b85f17f","name":"Martin Pe\u0161out","image":{"@type":"ImageObject","inLanguage":"cs","@id":"https:\/\/igloonet.cz\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/032ee2fb90b35a9a451f30dac27d46caf09d97dea956a64a208abc47dfca3251?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/032ee2fb90b35a9a451f30dac27d46caf09d97dea956a64a208abc47dfca3251?s=96&d=retro&r=g","caption":"Martin Pe\u0161out"},"description":"Jsem brn\u011bnsk\u00fd UI v\u00fdvoj\u00e1\u0159 p\u011bkn\u00e9ho frontendu. Od mali\u010dka si potrp\u00edm na detail, ale p\u0159itom kladu d\u016fraz na jednoduchost a p\u0159ehlednost. Zast\u00e1v\u00e1m n\u00e1zor, \u017ee jednodu\u0161\u0161\u00ed weby jsou ty nejkr\u00e1sn\u011bj\u0161\u00ed.","sameAs":["https:\/\/igloonet.cz\/vyvoj","https:\/\/x.com\/martinpesout"],"url":"https:\/\/igloonet.cz\/blog\/author\/cheetah\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/posts\/282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/comments?post=282"}],"version-history":[{"count":5,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/posts\/282\/revisions"}],"predecessor-version":[{"id":2473,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/posts\/282\/revisions\/2473"}],"wp:attachment":[{"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/media?parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/categories?post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/igloonet.cz\/blog\/wp-json\/wp\/v2\/tags?post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}