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!
-
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.
-
Az ODEO egy zenebirodalom. Interneten
keresztül készíthetsz és hallgathatsz felvételeket rajta.
-
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.
-
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
-
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
-
Írd le miért szeretnéd a Rails megismerni!
-
Írd le, mit hallottál róla és honnan!
-
Írd le van-e valami tapasztalatod a témában!
-
Nézd meg a Ruby weboldalát
a ruby-lang.org
címen! Mi a nyelv mottója?
-
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!
-
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!
-
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!
|