Ruby on Rails
 
Általános információk
Tanfolyamok ismertetése
Próba
Regisztráció
Belépés a rendszerbe
1. fejezet: A Ruby nyelv alapjai

Ruby on Rails távoktató anyag - 1


1. fejezet: Kedvcsináló

A Ruby on Rails(továbbiakban Rails) egy weboldalak fejlesztéséhez használható keretrendszer. Külön erőssége a Rails-nak, hogy mindent tartalmaz amire interaktív weboldalak fejlesztése során szükségünk lehet. Az adatbázis programozástól kezdve, a tesztelésen át, a vagány JavaScript-es effektekig mindent egy programozási nyelven, Ruby-ban írhatunk meg! Így nincs szükség több programozási nyelv ismeretére! Természetesen HTML-t és CSS-t azért fogunk használni.

A tanfolyam során megismerjük a Rails használatát és egy webáruházat fogunk elkészíteni. Azért egy webáruházat, mert minden fontosabb programozási kérdés felmerül a fejlesztésekor. Lépésről lépésre fogunk haladni, mindig szó lesz a szükséges elméleti háttérről is. Célunk az lesz, hogy az alapvető ismereteket elsajátítsuk. A kurzus végére mindenki megtanulhatja a modern webprogramozás legfontosabb fogásait úgy mint a Model-View-Controller(MVC) tervezési séma, sablonok használata, adatbázis kezelése, oldal újra töltés nélküli(Ajax) felületek kialakítása és tesztelés.

A tanfolyam során elkészülő webáruházat itt tekinthetjük meg:
http://www.pentaschool.hu:3000

Híres oldalak amiket Rails futtat

Nézzünk meg pár oldalt, amit Rails-al fejlesztettek és futtatnak! Szerencsére számtalan ilyen oldal van már az interneten, így kedvünkre válogathatunk. Emeljük ki a leghíresebbeket közülük! Azt javaslom, néz körül rajtuk, regisztrálj, próbáld ki hogy mit is tudnak!

  1. A Basecamp egy projekt menedzser alkalmazás. Nem más, mint a Rails kitalálója David Heinemeier Hansson készítette. Ez az oldal volt az első, amit Rails-al fejlesztettek. David cége a 37signals arról híres, hogy webalkalmazásikat rendkívül egyszerűen lehet használni. Ebből a forrásból rendkívül sokat merített a keretrendszer is amint azt majd meg látni fogjuk.
  2. Az ODEO egy zenebirodalom. Interneten keresztül készíthetsz és hallgathatsz felvételeket rajta.
  3. A Twitter az ODEO alkotóinak új közösségi chat szolgáltatása, ami már rengeteg számítógépet használó embert megfertőzött. Leírhatod 160 karakterben, hogy mit csinálsz és ezt barátaid is egyből meg fogják kapni. Így mindig tudhatod, hogy ki mivel foglalkozik éppen. A Twitter-t azért is érdemes megemlíteni, mert élő példa rá, hogy nagyon nagy látogatottságú oldalakat is lehet Rails-al fejleszteni.
  4. Shopify az egyik legszebb, legkiforrottabb webáruház rendszer amit eddig láttam. Te is pillanatokon belül saját áruházat hozhatsz létre! Eddig a hírek szerint több mint 20.000-en tették ezt meg az oldal segítségével.

Miért érdemes a Rails-t megismerni?

Az internet sokat fejlődött az elmúlt évek során. Ezt minden internetet használó ember érzi. Mindez mögött egy gyors technológiai, szemléletbeni átalakulás is áll. Mint mindennek, ennek is vannak nyertesei. Logikusan az fog nyerni, aki a legjobb szolgáltatást nyújtja a látogatóinak és azt a lehető leggyorsabban tudja elkészíteni. Ehhez pedig a legjobb eszközök kellenek...

A Railst azért készítették, hogy gyorsabban és egyszerűbben tudjanak a segítségével interaktív weboldalakat, webalkalmazásokat létrehozni. Sokaknak megtetszett ez a koncepció. Ezért van az, hogy hatalmas fejlesztői közösség alakult ki körülötte. Ez a közösség számos nagy koponyával is dicsekedhet. Jó ha tudjuk, hogy a Prototype javascript könyvtár, amivel AJAX-os interaktivitást tudunk oldalunkba programozni és a Script.aculo.us Javascript effekt könyvtár fejlesztői is Rails fejlesztők. Sok ügyes programozó dolgozik tehát a Rails-on, így jó esély van rá, hogy a nagy újdonságok a Rails háza táján fognak felbukkanni! Érdemes tehát foglalkozni vele!

Ennek a tanfolyamnak az a célja, hogy megértsük azokat az alapokat, koncepciókat amik a Ruby on Rails-t a web egyik legprofibb fejlesztőeszközévé teszik. A cél tehát a szemléletformálás lesz. Ezt a tudást később tovább lehet  fejleszteni, lehet rá építeni, akár Rails-al fogunk dolgozni, akár mással. A weben különösen igaz, hogy érdemes a programozási nyelvet a feladathoz választani. Nem mindent érdemes Rails-al csinálni. Viszont mindazt, ami a Rails használata során megtanulunk, hasznunkra lesz bármilyen fejlesztés esetén.

Rendben, nézzük, mi az ami a Railst egyedivé teszi! Több összetevő is van. Egyrészről a Ruby programozási nyelv. A Ruby arról híres, hogy nagyon természetesen lehet vele dolgozni. Minden úgy működik, ahogy az sejthető. Ha leírsz egy tőmondatot angolul, akkor az valószínűleg fog valamit jelenteni Ruby-ban is. A Ruby egyszerűsége és rugalmassága az az erős szikla amire a Rails épül. A Rails továbbviszi mindezt és egy olyan környezetet ad a kezünkbe, ami tartalmaz mindent ami ahhoz kell, hogy egy adatbázis alapú interaktív weboldalt, webalkalmazást hozzunk létre. Mindezt a lehető legegyszerűbben.

Amikor Rails-al dolgozunk elengedhetjük magunkat. Kevés kódot fogunk írni és azok még hónapok múlva is tisztán érthetőek maradnak, így lecsökken a programunk karbantartásával töltött idő. Ebben nagy szerepe van annak, hogy a konfigurációs fájlok helyett konvenciókra hagyatkozhatunk. Például a megfelelő kódrészletek pusztán a nevük alapján kapcsolódnak egymáshoz. Azt is elkerülhetjük, hogy ugyanazokat a kódokat újra és újra leírjuk. Rails-al nagyon hatékonyan fogunk tudni dolgozni. A hatékonyság persze még kevés, de ha teszteket is írunk a kódokhoz, akkor a kód minősége miatt sem lesznek álmatlan éjszakáink.

A tanfolyam célja

Ez a tanfolyam terjedelménél fogva nem alkalmas arra, hogy a Rails összes lehetőségét megismertesse. Mégis, a webáruház fejlesztésén keresztül egy átfogó képet fogunk kapni arról, hogy miként néz ki a munka Rails használatával. Ez az átfogó kép segítségével később könnyedén fejleszthetjük tudásunkat és válhatunk Rails guruvá. Első magyar nyelvű Rails tanfolyamként kiváló olvasmány lesz mindazoknak, akik először anyanyelvükön szeretnének némi betekintést nyerni a Rails működésébe.

Témák, amiket a tanfolyam során körül fogunk járni:

Nem baj, ha nem érted egyelőre őket!


  • Ruby ismertető
  • A Rails telepítése(Window, Linux rendszerre). A gem csomagkezelő használata
    • A Ruby,( gem,) Rails telepítése
    • Az Sqlite adatbázis motor telepítése
    • Radrails fejlesztői környezet használata
  • Hogyan épül fel egy Rails alkalmazás
    • Megismerjük a Rails könyvtárstruktúráját
    • Mit is takar az MVC tervezési séma?
  • Kódgenerálás és más hasznos parancsok elsajátítása
    • script/generate - kódgenerálás
    • script/plugin - kiegészítők telepítése
    • rake db:migrate - adatbázis műveletek
    • script/server - Rails futtatása, szerver elindítása/leállítása
  • Munka az adatbázissal:
    • Az adatbázis struktúrájának létrehozása migration fájllal
    • Munka az adatokkal
    • Kapcsolat definiálása az adatok között
    • Adatok ellenőrzése bevitelkor validator-ok segítségével
  • View/Controller használata
    • Az oldal felhasználói felületének megtervezése, template és layout kezelés
    • Gyors admin felület készítés scaffold segítségével
    • Interaktív felületek kialakítása Ajax-al - csak pár példa, teljes mélységében ez is egy külön tanfolyam anyaga lehetne
  • Tesztelés
    • Adataink tesztelése Unit tesztekkel
  • Nézzünk be a színfalak mögé!
    • Az interaktív Rails konzol és a logfájlok használata
  • Kiegészítők, pluginek telepítése és használata

Mi nem lesz benne az anyagban?

  • A teljes keretrendszer összes függvényének leírása, tehát ez nem egy teljes referencia.
  • Hogyan kell webszolgáltatásokat nyújtani. Vagyis nem tanulnuk meg API-t fejleszteni.
  • Számos tesztelési megoldás kimarad, úgy mint functional és integration tesztek.
  • Nem lesz szó arról, hogy hogyan kell egy elkészült Rails alkalmazást beélesíteni, mivel ahány hosting szolgáltató, annyi megoldás.(Majd ők segítenek, ne félj!)

Milyen rendszert fogunk használni?

A tanfolyam során használt programok számos operációs rendszeren futnak. Használhatsz Windows, vagy Linux rendszert is. Mivel várhatóan a legtöbben Windows-t használnak, így a tanfolyam anyaga ehhez igazodik. Linux alatt a terjesztések sokszínűsége miatt kicsit bonyolultabb a helyzet. Ezért a Linux-ot használókat leírások helyett hasznos linkekkel igazítom útba.

A telepítés közben mindig elmondom mit kell tenned. A következő programokat fogjuk feltelepíteni és használni:

  • Ruby - a programozási nyelv
  • Rails - a webfejlesztő keretrendszer
  • Sqlite - egy könnyed adatbázis kezelő
  • RadRails - egy Rails fejlesztőeszköz, ezt fogjuk használni szövegszerkesztésre és hogy megkönnyítse az életünket.
  • Subversion - egy verziókezelő rendszer, ami némely plugin telepítéséhez hasznos lehet

Azért fogjuk az Sqlite adatbáziskezelőt használni, hogy ne kelljen valami nagy memória igényű adatbázis szervert futtatnod fejlesztés közben. Mivel a Rails rengeteg adatbázis szervert támogat, így később fájdalommentesen válthatsz valamelyikre a következők közül: Mysql, Postgresql, Oracle, MsSql, Db2...

A verziószámok miatt nem kell aggódni. A tanfolyam írásának pillanatában a Ruby az 1.8.6, a Rails az 1.2.5, az Sqlite a 3.4.2 és a RadRails a 7.2-es verziónál tart. Azok az alapok, amiket most tárgyalni fogunk, a programok későbbi verzióival is működni fognak. Természetesen a tanfolyam anyagát aktualizáljuk a megjelenő főbb új verziókat figyelembe véve.

A Ruby telepítése

Ahhoz, hogy Rails-ban fejleszthessünk három dolog kell: Ruby, Rails és egy adatbázis szerver. Mindezt a lehető legegyszerűbb módon fogjuk feltelepíteni. Adatbázis szervernek éppen ezért a kicsi Sqlite-ot fogjuk használni. Természetesen később bármikor válthatsz pédául Mysql-re vagy Postgresql-re. Letöltünk majd egy fejlesztői környezetet is, hogy megkönnyítsük a munkánkat. Fontos megjegyezni, hogy igazából bármilyen szövegszerkesztővel dolgozhatnánk.

Ebben a fejezetben a Ruby nyelvet fogjuk feltelepíteni, hogy megtanulhassuk a főbb nyelvi elemeket! A Rails telepítését a következő fejezet tartalmazza!

A Ruby telepítő nem tartalmaz mást, mint a Ruby értelmezőt. Tehát ne várj valami nagy dologra. A Ruby nem érkezik egy minden jóval teletűzdelt fejlesztő eszközzel együtt. Mindössze egy egyszerű szövegszerkesztőt és egy interaktív parancssort fogunk találni a csomagban, de az elég lesz rá, hogy a nyelvi finomságokat megismerhessük. A későbbiekben majd telepítünk egy jól használható fejlesztőeszközt, a RadRails-t.

A Ruby telepítése Windows rendszeren

Telepítés előtt megjegyzem, hogy Windows alatt valami nem működik akkor, ha könyvtárunk nevében szóköz szerepel. Ha minden igaz akkor ezt az Sqlite adatbázis motor nem szereti. Ezért mindent a C: meghajtón létrehozott tanfolyam könyvtárba fogunk telepíteni.

Haladjunk sorjában! Töltsük le a legfrissebb Ruby telepítőt! Ebben a pillanatban ez a 1.8.6-25-ös verzió. Az első cím az eredeti oldal címe, a második pedig egy német tükörszerveré, ahonnan jóval gyorsabban hozzájuthatunk kedvenc programnyelvünkhöz.

http://rubyforge.org/frs/?group_id=167
http://rubyforge.rubyuser.de/rubyinstaller/

Ha letöltődött, indítsuk is el!


Majd adjuk meg, hogy a C:\tanfolyam\ruby könyvtárba települjön!



A többi ablakban csak nyomjunk a tovább gombra. Gond nélkül fel fog települni! Fontos megjegyezni, hogy a c:\tanfolyam\ruby\bin útvonal belekerül a Windows PATH környezeti változójába. Tehát a Ruby interpreter és más segédprogramok bárhonnan meghívhatóvá vállnak. Ezt később ki fogjuk használni az Sqlite adatbázis motor telepítésekor.

A Ruby telepítése Linux alatt

Linux alatt ajánlott a csomagkezelőnket használni! A következő programokat kell telepítenünk: ruby, rubygems, irb, ri, rdoc, scite!

Ubuntu alatt az irb és az rdoc telepítéséhez engedélyeznünk kell a közösségi karbantartású úgy nevezett "universe" szoftverforrásokat. Ezt a [Rendszer>Szoftverforrások] menüpontban tehetjük meg.

A telepítéshez Ubuntu esetén adjuk ki a következő parancsot a konzolon:
sudo apt-get install ruby, rubygems, irb, ri, rdoc, rake, scite
Mostantól úgy fogom venni, hogy a saját könyvtárunk alatt létrehozott tanfolyam könyvtárban fogunk dolgozni. Ez nálam a ~/tanfolyam. Ide fogjuk telepíteni a további dolgokat és itt fogunk dolgozni is. Mivel ez a könyvtár még nem létezik, hozd létre!

Telepítési problémák

Ha problémánk lenne a telepítéssel, nézzük meg a Ruby hivatalos oldalán a telepítéssel foglalkozó részt: http://www.ruby-lang.org/en/downloads/!

A parancssor elindítása

Sokszor fogunk parancssort használni. Ez Windows alatt MSDOS parancssort jelenti, Linux alatt pedig egy terminált. Fontos megjegyezni, hogy a könyvtárakat elválasztó jel Windows alatt a "\", Linux alatt pedig a "/". Tehát:
#Windows alatt így néz ki egy útvonal:
c:\tanfolyam\munka

#Linux alatt pedig így:
~/tanfolyam/munka
A tanfolyam során mindig el fogom mondani, hogy mit kell tenni ha Windows és mit, ha Linux alatt dolgozunk. Viszont, hogy ne kelljen ugyanazt a parancsot kétszer begépelnem, ha csak annyi különbség van, hogy a perjelek más irányba dőlnek, így mindig a Windows-os megoldást fogom leírni. Vagyis tanfolyam\munka. Ha Linux-ot használsz, arra kérlek, alakítsd ezt mindig át tanfolyam/munka alakúra!

Parancssort a következő képpen indíthatod el:

#Windows alatt:

[Start Menü>Programok>Kellékek>Parancssor] Ezzel elindítunk egy MSDOS parancssort.


#Linux alatt:

[Alkalmazások>Kellékek>Terminal] Ezzel elindítunk egy terminált.

Ruby gyorstalpaló

A Ruby egy egyszerű programozási nyelv. Script nyelv, vagyis a kódot nem kell külön lefordítanunk. Szintaxisa nagyban hasonlít az angolra, így annak aki egy kicsit is tud angolul, nagyon ismerősen fog csengni minden. Mivel egy nyelvet leginkább példákon keresztül lehet jól megismerni, így elsőként megismerkedünk pár programmal amelyek segítségével Ruby kódjainkat ki tudjuk próbálni. Indíts el egy parancssort, majd írd be a következőt:
irb
Ez a parancs elindítja a hires Interaktív Ruby parancssort. Kilépni az "exit" begépelésével tudunk. Írjuk be az alábbi parancsot, majd üssünk entert:
puts 'Helló Világ!'
A válasz valami hasonló lesz:
Helló Világ!
=> nil

A puts parancs kiírat valamit a képernyőre. Láthatóan kiíratta a köszöntésünket. Ami a "=>" jelek után következik, az mindig az általunk kiadott parancs visszatérési értéke. Most már könnyen eligazodunk. Próbáljuk ki a következőket:

4*2
=> 8


'Valami Amerika'.reverse

=> "akiremA imalaV"


'Valami Amerika'.upcase
=> "VALAMI AMERIKA"


'Valami Amerika'.upcase.reverse
=> "AKIREMA IMALAV"

%w(Valami Amerika).each {|w| puts w}
Valami
Amerika
=> ["Valami", "Amerika"]

Ha hosszabb programokat szeretnénk kipróbálni, akkor egy egyszerű kis szövegszerkesztő lesz a segítségünkre, a SciTE. Windows alatt a Programok között a Ruby szekcióban találjuk, Linux alatt pedig a fejlesztőeszközök között. Indítsuk is el! Írjuk bele a következő kis programot:

szoveg = 'Ez az első Ruby programunk.'
szoveg.upcase!
puts szoveg

Mentsük el a tanfolyam könyvtárba elso.rb néven! Majd futtassuk le a [Tools>Go] menüpontot, vagy az F5 gombot használva! Az eredmény magáért beszél!



Objektum az egész világ

A Ruby legfontosabb tulajdonsága, hogy teljesen Objektum-Orientált, azaz Ruby-ban minden objektum. Egy objektum-nak vannak adatai. Dolgozni pedig úgy tudunk vele, hogy üzeneteket küldünk neki! Például a következőképpen:
"Ruby on Rails tanfolyam".upcase   
=>"RUBY ON RAILS TANFOLYAM"
Látható, hogy a fenti példában egy String típusú objektumnak azt upcase üzenetet küldtük el, vagyis, hogy alakítsa át a szövegét nagybetűssé. Egyszerű mi?

Mi is az az OO?

Ha eddig nem találkoztál az Objektum-Orientált(röviden OO) programozással, akkor ez a pár sor neked szól. Ha igen, nyugodtan ugorj a következő címhez!

Az Objektum-Orientáltság egy programozási módszertan. Az egészet egy példával próbálom megvilágítani.

Képzeljük el, hogy egy ügyfélkezelő rendszert írunk. Először meg kell néznünk milyen adatokal kell dolgoznunk. Kategorizáljuk a különböző fajta adatokat! Lesznek ügyfeleink, azokhoz kapcsolódnak munkák, stb.

A következő lépésben megpróbáljuk az adatokat a programozási nyelven valahogy modellezni. Látható, hogy az azonos kategóriába tartozó adatoknak a tulajdonságaik nagyrészt megegyeznek. Például minden ügyfélnek van neve és születési éve. Érdemes lenne valahogy úgy modellezni az ügyfeleket, hogy az adataik és az azokon végezhető műveletek valahogy összekapcsolódjanak. Erre való az Objektum-Orientált programozás. A hasonló adatokat osztályokkal fogjuk modellezni. Egy osztály nem más, mint adatok és azokon dolgozó műveletek(függvények és metódusok) egy kombinációja.

Egy osztály tehát két dologból áll:
  • adatok, ezeket adattagoknak nevezzük szaknyelven
  • és műveletek, amik ezekkel az adattagokkal dolgoznak
 
Például adattag lehet az ügyfél neve és születésének éve, metódus pedig ami kiszámítja az ügyfél életkorát a születés éve és az aktuális évszám alapján. Az osztály tehát általánosítása egy adott fajta adatnak, például az ügyfeleinknek.

Az ügyfél osztály a következőt tartalmazhatná:
  • Adattagok
    • ügyfél neve
    • ügyfél születési éve
  • Műveletek
    • ügyfél életkora(aktuális évszám - ügyfél születési éve)

Mindez így néz ki Ruby nyelven:
class Ugyfel
    def initialize(nev, szuletesi_ev)
       @nev = nev
       @szuletesi_ev = szuletesi_ev
    end

    #Definiálok egy metódust, amely visszaadja az ügyfél nevét.
    #Nem kell nev-nek neveznem, nevezhetnem ugyfel_neve-nek is nyugodtan.
    def nev
       return @nev
    end

    #Hasonlóan a nev-hez...
    def szuletesi_ev
       return @szuletesi_ev
    end

    #Ez a metódus számítja ki az ügyfél életkorát
    def eletkor
       #Létrehozunk egy aktuális időt tartalmazó objektumot,
       #majd lekérjük belőle az évszámot = Time.new.year()
       return Time.new.year()-@szuletesi_ev
    end
end
A SciTE szövegszerkesztőben a [File>New] paranccsal hozz létre egy új fájt, másold bele a fenti kódot és mentsd el a tanfolyam könyvtárba ugyfel.rb néven! Mivel ez a kód még semmi látványosat nem csinál, várj még a futtatással egy kicsit!

Az ügyfél osztály tehát az ügyfeleink egy általánosítása. Mit teszünk akkor, ha egy adott ügyfelet szeretnénk modellezni? Ebben az esetben nagyon is konkrétan szeretnénk az ügyfelünk adatait számon tartani. Erre való az osztály példányosítása. Tehát az osztály olyan mint egy öntőforma. Amikor példányosítunk, akkor ezt az öntőformát töltjük ki az aktuális adatokkal. Legyen egy ügyfelünk a következő adatokkal:
név - Gipsz Jakab
születési év - 1972
Ebben az esetben, ha mindezt beletöltjük az ügyfél osztályba, akkor a következőt kapjuk:
  • Adattagok
    • név = Gipsz Jakab
    • születési év = 1972
  • Műveletek
    • ügyfél életkora(aktuális év - születési év = valamennyi)

Most hozzunk létre példányokat az Ugyfel osztályunkból. Ruby-ban a new metódussal hozunk létre egy példányt:
gj = Ugyfel.new('Gipsz Jakab', 1972)

#Kiíratjuk a nevét
puts gj.nev

#Kiíratjuk a szuletesi évét
puts gj.szuletesi_ev

#Kiíratjuk az életkorát
puts gj.eletkor
A fenti kód segítségével tudjuk kipróbálni az ugyfel.rb-ben lévő kódjainkat. Másold ezt a kódot a többi alá! Majd futtasd le!


Az ügyfélkezelő rendszerben számos ügyfelünk van. Ezek mind az ügyfél osztály példányai. Mindegyik saját névvel, életkorral rendelkezik. Mégis, mivel az ügyfél osztályból példányosítottuk őket, így azonos adattagjaik lesznek és azonos műveleteket tudunk rajtuk elvégezni.


Ennyi bevezetés elég lesz, később úgy is minden tisztulni fog az objektumokkal kapcsolatban!

Nevezéktan, hogy minden egyértelmű legyen

Röviden összefoglalom, hogyan adhatunk neveket Ruby-ban.

Lokális változók, függvényeket, metódusokat és paramétereik nevét mindig kis betűvel, vagy aláhúzással kezdjük.
ugyfel
munka
_munka
Példányváltozók neve @ jellel kezdődik. Konvenció, hogy a többtagú neveket aláhúzással bontsuk részekre, hogy könnyebben olvashatóak maradjanak.
@ugyfel_neve
@ugyfel_szuletesi_eve
@ugyfel_szuletesi_evenek_utolso_szamjegye
Osztályok, program modulok és a konstansok nevei nagy kezdőbetűvel kezdődnek. Ekkor a többtagú szavakat egybe szokás írni, úgy hogy minden szó elejét nagy kezdőbetűvel írjuk
Ugyfel
Munka
NyariMunka
PI
Sokszor fogunk munkánk során szimbólumokkal találkozni. A szimbólum neve kettősponttal kezdődik. Hogy mik is ők, azt hamarosan látni fogjuk!
:id
:ugyfel_neve

Emlékszünk még az ügyfél osztályos példára? Nézzük meg ott a neveket közelebbről!

#Ugyfel az osztály neve, tehát nagy betűvel kezdődik!
class Ugyfel  

    #A nev és a születesi_ev az initialize metódus paramétere, így kis betűvel kezdődnek.
    def initialize(nev, szuletesi_ev)  
   
        #A @nev az Ugyfel osztály példányváltozója, vagyis egy adattag. Ezért kell @-al kezdeni.
       @nev = nev  
       @szuletesi_ev = szuletesi_ev
    end

    #A nev egy metódus, ezért nevét kis betűvel kezdjük.
    def nev
       return @nev
    end
...

Metódusok

Hozz létre a SciTE segítségével egy új fájlt a tanfolyam könyvtárban koszones.rb néven. Írd bele és próbáld ki benne a kódokat!

Írjunk egy metódust, ami köszönt minket a munkánk kezdetén!
def jo_munkat(nev)
    result = "Jó munkát " + nev
    return result
end

#Próbáljuk is ki!
puts jo_munkat("Rails mester")
Látható, hogy metódust a def kulcsszóval hozunk létre. Ezt követi a metódus neve, majd zárójelben a paraméterek. A metódus törzsében szokás mindent két szóközzel beljebb kezdeni. A sorok végére lehet, de nem kell pontosvesszőt tennünk. Végezetül írjuk oda, hogy end. Létrehoztunk egy lokális változót is result néven, ezt csak a metódus törzsén belül tudjuk elérni. Próbáljuk is ki! A puts parancs kiírat valamit a képernyőre.


Miért van az, hogy az egyik parancs paramétereit zárójelbe tesszük, a másikét nem? A helyzet az, hogy Ruby-ban nem kötelező zárójeleket használnunk. Csak akkor kell őket kiírni, ha nélkülük nem egyértelmű mit is szeretnénk. A két megoldás tehát azonos:
puts jo_munkat("Humor Herold")
puts(jo_munkat("Humor Herold"))
Térjünk vissza a metódusunkra! A második sorban látható, amint két szöveget egymáshoz fűzünk. Tehát a szövegeket, String-eket egyszeres, vagy dupla idézőjelekkel kell megadni.
"Valami Amerika"
'Valami Amerika'
Az első esetben, ha dupla idézőjelet használunk, akkor a Ruby egy kicsivel több munkát végez. Ekkor megnézi, hogy nem-e kell behelyettesítenie valamit a szövegbe. Például a \n helyére egy új sor karaktert tesz. Ha egy változó értékét szeretnénk behelyettesíteni, akkor a #{valtozonev} formát kell használnunk! Írjuk újra a függvényünket! Használjuk ki azt a lehetőséget, hogy ha nincs return utasítás, akkor a Ruby az utolsó sor értékét adja vissza!
def jo_munkat(nev)
    result = "Jó munkát #{nev}!"   #Itt az történik, hogy a Ruby a #{nev} helyere behelyettesíti a nev paraméter értékét.
end

#Próbáljuk is ki!
puts jo_munkat("Rails mester")   #Jó munkát Rails mester!
Természetesen nem kötelező ezt a behelyettesítő formulát használnunk. Az is jó, ha csak egyszerűen összefűzzük a szövegeket így:
def jo_munkat(nev)
    result = "Jó munkát " + nev + "!"
end

#Ruby-ban, a PHP-tól eltérően az összefűzés operátor a +

Sőt, mivel a result változót nem használjuk, így azt is elhagyhatjuk! Így már tényleg jó rövid a metódusunk!

def jo_munkat(nev)
    "Jó munkát #{nev}!"
end


#Próbáljuk is ki!
puts jo_munkat("Rails mester")   #Jó munkát Rails mester!



Osztályok definiálása

Egy egyszerű osztály a következően nézhet ki:
class Ugyfel
    def initialize(elso_nev)
       @nev = elso_nev   #Itt definiálunk egy nev nevű adattagot, ez egy példányváltozó
    end

    #Ez a metódus visszaadja a @nev ertékét. Szaknyelven ezt hívjuk "getter"-nek.(get = kap angolul)
    #Egy getter metódust érdemes a visszaadni kívánt változóról elnevezni, de persze adhatunk más nevet is neki.
    def nev
       @nev
    end

    #Ez pedig segít megváltoztatni. Ennek "setter" a neve.(set = beállít angolul)
    def nev=(uj_nev)
       @nev = uj_nev
    end
end
Ezt a következően használhatnánk:
ugyfel = Ugyfel.new("Juhász Attila")
puts ugyfel.nev   #=> Juhász Attila

ugyfel.nev="Gipsz Jakab"   #új nevet adunk az ügyfelünknek
puts ugyfel.nev   #=> Gipsz Jakab
Láthattuk, hogy új osztályt a class kulcsszóval hozunk létre. Példányosítani pedig a new kulcsszóval lehet. Az initialize metódus az, ami példányosításkor lefut. Itt kell definiálni a példányváltozókat. A kezdeti értékadás is itt történik meg. Érdekes, hogy van két egyforma nevű metódusunk. Vagyis majdnem. A második nev nevű metódus neve után közvetlenül szerepel egy egyenlőség jel, ami arra utal, hogy értékadás esetén ő fog lefutni. Tehát az első metódus egy getter, ami visszaadja egy változó értékét, a második egy setter, amivel változtatni tudjuk. Érdemes őket a hivatkozott példányváltozóról elnevezni, de persze hívhatnánk máshogy is őket.

Mi most kézzel írtuk meg azokat az egyszerű metódusokat amikkel a @nev példányváltozónk értékét lehetett lekérdezni vagy módosítani. Van erre egyszerűbb megoldás is:
class Ugyfel
    attr_accessor    :nev    #Készít egy olvasó és egy író metódust is a névnek.(getter és setter)
    attr_reader    :beosztas    #Készít egy olvasó metódust a beosztásnak.(getter)
    attr_writer    :fizetes    #Készít egy író metódust a fizetésnek.(setter)

Újonnan megszerzett tudásunk birtokában módosítsuk a már meglévő ugyfel.rb fájl kódját! A módosított kódot mentsük el ugyfel2.rb néven! A név legyen megváltoztatható, de a születési évet csak egy új példány létrehozásakor lehessen megadni. Természetesen mindkét adattagot lehessen olvasni. Használjuk a fentebb látható parancsokat!



Szimbólumok

Mi is az a szimbólum? A szimbólum egy olyan változó, aminek a neve kettősponttal kezdődik:
:user
:shopping_cart
A szimbólum nem más mint egy mutatószó. A :user jelentése "az a valami amit úgy hívnak user". Azért hasznos, mert nem kell megmondanunk, hogy konkrétan milyen változóra gondolunk. Az :user mutathat egy lokális változóra éppúgy mint egy példányváltozóra. Fontos megjegyezni, hogy bármikor használhatunk szimbólum helyett egyszerű szöveget is. Akkor miért jó? Átláthatóbb lesz tőle a kód és gyorsabb.

Van még egy érdekesség. Nézzük meg a következő kódokat! A kódokat az interaktív Ruby shell-be, az IRB-be írtam be.
irb(main):001:0> "szöveg".object_id
=> 50228720
irb(main):002:0> "szöveg".object_id
=> 49603000
irb(main):003:0> :szoveg.object_id
=> 1023858
irb(main):004:0> :szoveg.object_id
=> 1023858

Mi az érdekes a fenti kódban? Az hogy mint látható, ugyanannak a szövegnek, ha újra beírjuk, más és más objektum azonosítója, object_id-je lesz. Ezzel szemben két egyforma nevű szimbólumnak ugyanaz az azonosítója. Tehát az azonos szövegű szimbólumok csak egyszer szerepelnek a memóriában.

Tömbök és hash táblák

A tömbök és a hash táblák nem mások mint indexelt kollekciók. A tárolt adatokat egy kulcs alapján találhatjuk meg. A különbség az, hogy tömbök esetén az index egy szám, egy Integer, a hash tábla esetén pedig egy szöveg, vagyis egy String. A hash tábla igazából nem más mint egy asszociatív tömb. Egyiknek sincs limitálva a mérete, vagyis annyi dolgot pakolhatsz bele, amennyit csak szeretnél! A tömbökben gyorsabban találhatsz meg egy elemet, viszont a hash tábla kevésbé köti meg a kezedet. Nézzünk meg ezt példákon keresztül:
#Létrehozunk egy új tömböt
tomb = [1, 2.7, "Valami Amerika"]

#Lekérdezzük az első elemet
tomb[0]

#Fűzzünk hozzá egy új elemet
tomb << 'Üvegtigris'

#Van egy rövidítés szavak tömbbe pakolására
tomb = %w {Most akkor minden szó egy eleme lesz a tömbnek}  
#=> ["Most", "akkor", ...]
#Létrehozunk egy új hash táblát
#A bal oldalt álló valami az a kulcs, a jobb oldalon van az amit tárolunk

honapok = {
    :elso => "Január",
    :masodik => "Február"
}

#Figyeljük meg, hogy kulcsnak szimbólumot használunk.
#Használhatnánk szöveget is, de a szimbólum gyorsabb és átláthatóbb.
honapok[:elso]   #Visszaadja, hogy "Január"

Vezérlési szerkezetek

Vezérlési szerkezetekre is szükségünk van. Szerencsére egyszerű dolgunk lesz, a Ruby-ban még ezek is nagyon, nagyon egyszerűek.
#Elágazás

valami = 3

if valami > 10
    puts "valami nagyobb mint tíz"
elsif valami > 5
    puts "valami nagyobb mint öt"
else
    puts "nagyooon kicsi"
end 

#Ciklus

while valami < 10
    puts valami
    valami += 1
end

#Hagyományos for ciklust nem használunk Ruby-ban,
#mindjárt kiderül, hogy miért...

Blokkok és Iterátorok

Egy blokk nem más, mint pár sor kód két kapcsos zárójel, vagy egy do..end közé zárva. Valahogy így:
{
    puts "hello"
}

#Vagy

do
    puts "Hello "
    puts "világ!"
end

Ami érdekes, hogy blokknak lehet paramétert átadni. Ezt a paramétert a blokkon belül használhatjuk. A blokk paraméterét || jelek közé kell írni.

do |animal|

    puts animal.name

end


#vagy

{ |animal|

    puts animal.name

}


#Általában a {}-jellel jelölt blokkokat egy sorba szokás írni. Így:

{|animal| puts animal.name}

Ne ijedj meg, nem baj ha nem látod még miért lesz ez jó. Hamarosan kiderül. Ha a fenti kódokat kipróbálod, észreveheted, hogy nem működnek. Fény derül mindjárt arra is, hogy miért.(Mert egy blokk nem állhat önmagában.)

Hogyan tudunk végiglépkedni egy tömbön?

Sokszor van szükség rá, hogy végiglépkedjünk egy kollekción. Mondjuk a fentebb definiált tömb elemeit szeretnénk kiíratni szépen egymás után. Erre több lehetőség is van. Legkönnyebben egy for ciklus segítségével érhetünk célt. Ilyen konstrukció más programozási nyelvekben is van, Ruby-ban azonban ez is sokkal egyszerűbb!
for elem in tomb
    puts elem
end

#Itt az történik, hogy a tömb elemei egymás után belekerülnek az elem változóba.
#Amit aztén kényelmesen kiíratunk.
#PHP alatt a foreach használható hasonlóan.
A másik lehetőség egy blokk és egy iterátor használata. Mi is az az iterátor? Az egy olyan metódus, ami egymás után visszaadja az elemeket. Kapcsoljunk hozzá egy blokkot és már készen is vagyunk!
tomb.each do |elem|
    puts elem
end

#vagy rövidebben {}-val írva:

tomb.each{|elem| puts elem}
#Kiírja sorban, hogy 1,2.7,"Valami Amerika",...

A fenti példákban tehát az each a tömb iterátora, ami az elemeket sorban belepakolja a blokk |elem| paraméterébe. Ennek segítségével szépen sorban kiíratjuk az elemeket.

Kivételkezelés röviden

Sokszor van szükség arra, hogy hibákat kezeljünk le. Például előfordulhat, hogy a termék, amit a vásárló keres, már nem található. Ez egy nem szokványos viselkedés a program részéről. A Rails a legtöbb ilyen esetben generál egy kivételt és leállítja a kérés feldolgozását. A kivétel nem más, mint a nem várt viselkedés egy leírása. Ha azt szeretnénk, hogy a felhasználó ilyen esetekben is valami értelmes választ kapjon vissza, akkor ezeket az eseteket, kivételeket le kell kezelnünk.

Most nem fogunk nagyon mélyen elmerülni a kivételkezelés, amúgy nagyon izgalmas, témakörében, hanem csak a legszükségesebb tudással vértezzük fel magunkat!

Képzeljük el azt az esetet, amikor a felhasználó által keresett termék nem található. Hogy kezelni tudjuk a hibát, először tegyük a kérdéses kódot begin és end közé:
begin
    #A Product.find(1) megkeresi az 1-es azonosítójú terméket.
    #A probléma ott kezdődik, ha ilyen nem létezik.
    @product = Product.find(1)
end
Majd írjunk egy rescue(megszabadít) ágat, mely akkor hajtódik végre, ha valamely nem várt esemény bekövetkezik:
begin
    @product = Product.find(1)
rescue
    #Ide jön, amit akkor kell csinálni, ha valami baj történt.
    #Például beleírhatjuk a log fájlba, hogy baj van!
    logger.info("Nem található az 1-es azonosítójú termék!")
end

Jó, ha egy else(különben) ágat is definiálunk, ahova azok a kódok kerülnek, amik akkor futnak le, ha semmilyen hiba nem történt. A tökéletes megoldás tehát így nézhet ki:

begin
    @product = Product.find(1)
rescue
    #Ide jön, amit akkor kell csinálni, ha valami baj történt.
    #Például beleírhatjuk a log fájlba, hogy baj van!
    logger.info("Nem található az 1-es azonosítójú termék!")

else

    #Ide pedig azt, ami akkor következik, ha minden rendben.

    logger.info("Megtaláltam az 1-es terméket!")

end

Egy kis ínyencség

Végezetül pár apróságot szeretnék megemlíteni. Ezeket nagyon jól lehet használni a mindennapokban. Az első hasznos jelölés a következő:

#Ha még nincs értéke a szam változónak, akkor az egyenlőség mögött

#álló kifejezés kerül bele. Itt éppen 0.

#Ha már van, akkor nem csinál semmit.

szam ||= 0

A következő hasznos dolog, hogy Ruby-ban a feltételeket írhatjuk a parancs után is:
#Kiírja, hogy "hello", ha a név Jakab.
puts "hello" if name == "Jakab"

Sokszor szoktuk feltételekben valaminek az ellentétét ellenőrizni. Ekkor használhatnánk az unless-t is.

#A feltétel hamis volta érdekel minket:

if !true

  puts "hamis"

end


#Ugyanez másképp:

unless true

  puts "hamis"

end

Természetesen az unless is kerülhet a parancs mögé:

puts "hamis" unless false

Összefoglaló

Gratulálok! Elsajátítottad a Ruby nyelv alapjait. Mostantól tényleg csak a Rails rejtelmeire fogunk koncentrálni! És fejezetről fejezetre többet és többet fogsz megtudni erről a rendkívül népszerű webalkalmazás fejlesztő keretrendszerről! Ne ijedj meg, ha ebben a fejezetben nem értettél mindent, hiszen a gyakorlatban sokkal átláthatóbbak lesznek a példák. Lesz tehát idő megszokni az új nyelvi szerkezeteket.

Kapcsolódó oldalak

A tanfolyam során elkészülő webáruház:
http://www.pentaschool.hu:3000

Feladatok

  1. Írd le miért szeretnéd a Rails megismerni!
  2. Írd le, mit hallottál róla és honnan!
  3. Írd le van-e valami tapasztalatod a témában!
  4. Nézd meg a Ruby weboldalát a ruby-lang.org címen! Mi a nyelv mottója?
  5. Csináld végig az interaktív feladatokat a http://tryruby.hobix.com/ címen! Elég a help szót beírnod az elinduláshoz!
  6. Fejleszd tovább az ugyfel.rb kódját úgy, hogy írj egy függvényt, ami üdvözli az adott ügyfelet! Mentsd el ugyfel3.rb néven! A kódot küldd el nekem!
  7. Készíts egy új osztályt Konyv néven!(A fájl neve legyen konyv.rb!) Tárolja a könyv címét, szerzőjét és ISBN számát! A könyv ISBN számát csak csak új példány létrehozásakor lehessen megadni és később csak olvasni lehessen. A másik két adattag legyen írható olvasható! Ezt is küld el nekem!





A Pentaschool Oktatási Központ bármely dokumentumának vagy dokumentum
részletének másolása kizárólag a tulajdonos írásos engedélyével történhet!

Copyright 2002-2003 Pentaschool Bt.
Minden jog fenntartva.

 
Címünk: 1051 Budapest, Sas utca 25. VI. em. Telefon/Fax: (1) 472-0679 E-mail nekünk