Jeigu nors trupučiu susiduriate su internetinių projektų kūrimu, tikrai turėjote nors viena ausimi girdėti apie Ruby on Rails. Situacija tokia, kad vieni programuotojai jais žavisi, kiti nekenčia, treti ignoruoja, tačiau visi kalba ir pradinis Rails buzzas po truputį virsta į rimtą šio frameworko vertinimą. Be to, kad daugėja gerai žinomų projektų, sukurtų su Rails (ko gero žinomiausias - twitter), nemažai frameworkų kitomis kalbos yra tiesiog wannabe Rails. Iš PHP pusės galima pavardinti: Akelos, Biscuit, CakePHP, CodeInteger, PHP on Trax, Sapphire, Symfony project, TaniPHP ir t.t. Kodėl Rails idėjos tokios patrauklios, kad taip intensyviai bandomos (sakyčiau, tik bandomos) perkelti į kitas kalbas?

Viena iš priežasčių - Ruby on Rails padeda sutaupyti laiko (development speed). Kartą manęs grupiokas paklausė “pasakyk, kaip konkrečiai?”. Taigi, pagrindinė Rails magija, sutaupanti laiko detalėms ir padedanti koncentruotis ties sudėtingąja aplikacijos dalimi:

  1. MVC. Ko gero geriausias būdas organizuoti web aplikacijos kodą. Vieninga struktūra leidžia lengvai pradėti, perimti ir įsilieti į kitus projektus. Paėmus ne savo kodą lengva orientuotis, o pradėjus naują nereikia gaišti laiko skeletui.
  2. ORM (Object-relational mapping) arba konkrečiai ActiveRecord. Klasės atstovauja lenteles, taigi vietoj SQL sakinių rašymo užtenka apibrėžti asociacijas keliais sakiniais ir pradėti mėgautis objektiniais malonumais:
      # Tarkime, turime sarysi straipsniai-komentarai 1:N
      articles = Article.all # turime visų straipsnių masyvą
      article.first.comments # turime pirmojo straipsnio komentarus
      Article.find_by_author('Vidmantas') # find_by_<em>column_name</em>
      # Asociacija N:N? Vienas malonumas:
      # Modelyje nurodom:
      has_and_belongs_to_many :tags
      # Ir važiuojam:
      Article.find(id).tags

    Tiesa, specifinėse aplikacijose tenka rašyti reikiamus sudėtingus SQL rankomis, nes taip tiesiog efektyviau - vykdome find_by_sql. Neblogas dalykas ir duomenų bazių migracijos, kuriose Ruby kalba aprašoma kaip keičiasi lentelių struktūra ir su Rails pateikiamais įrankiais galima lengvai “vaikščioti” tarp duomenų bazės versijų. Žodžiu, vienas džiaugsmas.

  3. Helperiai. Pakelkite rankas, kam nedžiūsta rankos, rašant vis tas pačias formas? Vis rūpinantis, kad neteisingo formato duomenys nepraslystų ir vartotojas apie tai gautų žinią? Teisingai suformuoti informaciją? Rails visa tai pasirūpinta.
  4. Ajax integracija:
     # view
     &lt;% remote_form_for @article do |f| %&gt;
       # forma...
     &lt;% end %&gt;
     # controller
     if request.xml_http_request?
       Article.create(params[:article])
     end

    Kitais žodžiais - pamirškite rūpinimasi Ajax diegimu į savo programas. Kitas pavyzdys.(beje, kviečiant formos metodus Rails automatiškai įterpia apsaugą nuo forgery atakos)

  5. Pluginai. Mano mėgstama dalis :-) Programuodami su Rails, galite patikėti rūpestį dažniausiai sutinkamiems uždaviniams spręsti įskiepiams. Reikia failų įkėlimo? Vartotojų registracijos? Komentavimo galimybės? CAPTCHA? Permalink generavimo? Trūksta kokios nors galimybės standartiniame Rails? Į visus šiuos klausimus yra atsakymas: įskiepis. Tarkime, norite failų įkėlimo galimybės:
     # instaliuojame įskiepį
     script/plugin install http://svn.techno-weenie.net/projects/plugins/attachment_fu/
     # ir pareiškiame apie savo ketinimus modelyje
     has_attachment :content_type =&gt; :image, :resize_to =&gt; [50,50], :max_size =&gt; 1.megabyte
     # wuolia, turime pilnai veikiantį failų uploadą su thumbnailų generavimu!

    Negana to, dažnai įskiepiai turi pilnus testus, tad galite būti tikri, kad viskas veikia taip, kaip turėtų.

  6. DRY, KISS ir kt. Svarbus dalykas - ilgalaikėje perspektyvoje nesutaupysite laiko ir nervų, jeigu nesilaikysite pagrindinių Rails kodavimo principų - DRY, KISS, “fat model, thick controller” ir testavimo. Apie šiuos principus puikiai išdėstyta www.inter-sections.net.
  7. Convention over configuration. Tai itin svarbi lietuviškai neverčiama savybė. Viskas Rails veikia su nuostata, kad viską darote standartiniu keliu, tad nereikia nieko papildomai nurodinėti. Jeigu nenurodote kitaip, controllerio metodo kvietimas naršyklėje reikš, kad reikia ieškoti layouto pavadinimu “application” ir šablono su metodo pavadinimu ir plėtiniu html.erb. Tačiau viską, esant būtinybei, galima nesunkiai keisti, nurodant kaip nestandartiniai turi veikti aplikacija.
  8. Ir negaliu to nepaminėti - kodo grožis! PHP niekada neaplenks Ruby vien dėl savo C stiliaus makaronų aplink viską, kas tik randama :-) Unikali savybė - blokai - atveria puikias kodo rašymo galimybes, dėl ko, esu įsitikinęs, supratote visą kodą pavyzdžiuose net nemokėdami Ruby!

Be abejo, Rails be pliusų turi ir savų minusų, o aklas bet kurio gero daikto taikymas visose įmanomose situacijose nekvepia geru. Tačiau faktas, kad man Ruby on Rails grąžino džiaugsmo pojūtį į programavimą. Kviečiu ir jus pabandyti - bent jau pasisemti puikių idėjų.