Rég nem írtam, pedig sok érdekeset találtam és tanultam mostanában. Igazából három téma van, amiről szeretnék írni. Az egyik a teszt vezérelt fejlesztés, ami itthon szinte még ismeretlen fogalom, de legalábbis alig-alig használt eljárás. (A weblabor nemrég megjelent, PHP osztályok egységtesztelése című írása hiánypótló, ajánlom mindenkinek, aki számára ez új témakör!) A második a PHP-GTK, amit nagyon sokan ismernek és használnak, de valahogy elég gyengén dokumentált még nemzetközi szinten is, itthon meg pláne. A harmadik pedig Ruby és Python fejlesztések, amikkel csak most ismerkedek igazából én is.
Ja és sok mindent nincs mit írni róla, de nagyon jó volt az első JavaScriptes meetup, jövő héten pedig jön a második! Azt nem mondom, hogy próbáljatok meg eljönni, mert úgy is megint tele lesz a terem, de várom már az biztos!
Na de térjünk a tárgyra! Úgy döntöttem a Ruby lesz a következő programnyelv amivel megismerkedek, bár nem kizárt, hogy párhuzamosan el fogom kezdeni a Pythont is, hogy élesben alkothassak véleményt róluk. Mindkét nyelv arról ismert, hogy szép, tömör, lényegretörő. A Python mellett szól, hogy gyorsabb és az asztali alkalmazás fejlesztéshez is széles eszköztárat kínál, míg a Ruby mögött nagyobb a felhajtás és erősebb a közösség. Ezen kívül utóbbi sokkal inkább a webes fejlesztésre orientálódik, mivel a Ruby on Rails (rövid nevén RoR vagy Rails) keretrendszer húzza maga után a nyelv fejlesztését is. Legalábbis ezt mondják a nagyok, én meg csak közvetítek, mint szinte mindig.
Na de ne is teketóriázzunk sokat, hanem játszunk egy kicsit a Rubyval, mint nyelvvel, hasonlítsuk össze kedvenceinkkel, aztán essünk neki a Railsnek.
Igazából nem kizárt, hogy ez a kis mini-tanfolyam már létezik magyarul, de úgysem pontosan fogom követni a szöveget, így talán annak sem jön rosszul ez a verzió, aki már az eredetit olvasta. Mindenesetre én egy-két bevezetőnek szánt írás elolvasása után úgy döntöttem, hogy a hivatalos útmutató kezdőlépéseit követem és alakítom át a saját belátásom szerint.
Az írás azzal kezd, hogy elmondja, mik is a Rails alapfilozófiájának elemei. Én ebbe most nem szeretnék nagyon belemenni, a lényeg röviden annyi, hogy nagyon gyors fejlesztést tesz lehetővé azáltal, hogy tipikusan mindennek van egy alapértelmezett értéke és csak akkor kell konfigurálással vesződni, ha el akarunk attól térni. Ezen felül még az lehet fontos, hogy egy kiterjesztett MVC architektúrára épül és erősen támogatja a REST alapú szolgáltatásokat. Igazából ezeket ma már minden komolyabb PHP alapú keretrendszer alkalmazza, így valószínűleg ezekben sok újdonság nincs, térjünk a lényegre!
Vigyázat! A következő írás azzal az előfeltétellel lesz csak teljes értékű, hogy az olvasó legalább egy MVC architektúrájú, szkript nyelv alapú keretrendszert ismer. Az egyes lépések talán ennek hiányában is követhetőek, de ami az általam ismert keretrendszerekben közös, azokat köztudottnak tekintem.
Telepítés
Először is töltsük le a Ruby legújabb stabil verzióját, ez jelenleg az 1.9.1-es verzió. A linuxot használóknak könnyű dolguk van, mert a legtöbb disztribúcióban benne van és tipikusan egy sor begépelésével fel is telepíthetik. Ubuntun például így:
sudo apt-get install ruby1.9.1-full
Windowsra sem egy ördöngősség, csak a weboldalt kell megtalálni a telepítőhöz, de én már megtaláltam nektek: http://rubyinstaller.org/
Ha a Ruby már a gépen van, akkor Windowson még érdemes a telepített csomag konzolját kinyitni, mert az hozzáadja a legfontosabb fájlokat az elérési útvonalhoz és nem kell nekünk szerkeszgetni/szemetelni a Windows PATH-t.
Ha ez megvan, installáljuk a Railst, ez már platform független lesz:
gem install rails
Talán annyit még fűzzünk ide, hogy a gem és a később előkerülő rake a ruby segédprogramjai, előbbi telepítésekért, utóbbi adatbázis műveletekért felelős ebben a cikkben.
A Rails telepítése után navigáljunk a leendő RoR projektjeinket tartalmazó könyvtárba és hozzunk létre egy új Rails projektet. A Rails alapértelmezetten Sqlite3 adatbázist szeretne használni, én viszont MySQL-t fogok, ráadásul a szokásos blog alkalmazás helyett egy webáruházat építek kezdő projektként. Ezeknek megfelelően a következőképpen hozom létre az rshop nevű új projektet:
$ rails rshop -d mysql
Kis szerencsével fennakadás nélkül létrejön a projektünk és láthatjuk, hogy kaptunk egy szép rakás könyvtárat és fájlt. Nyissuk meg a config/database.yml-t és lepődjünk meg, hogy a Rails már be is állított magának 3 adatbázis konfigurációt development, test és production néven. (Ha esetleg valaki nem tudná, ez egy YAML (ejtsd: dzseml) fájl, ami egy elterjedt leíró nyelv. Főleg ilyen konfigurálásra szokás használni, mivel mint látható, igen jól olvasható az emberi szem által. A PHP világában talán a Symfony keretrendszer a legjellegzetesebb használója, de más projektekben is megtalálható.)
Mindenesetre itt és most elég, ha arról meggyőződünk, hogy a fejlesztési (development) környezetekhez tartozó adatbázisok kapcsolódási adatai rendben vannak, mert erre hamarosan szükségünk lesz.
Mielőtt azonban létrehoznánk a táblákat, installáljuk a Rails MySQL modulját a parancssorunkból, ennek hiánya ugyanis biztosan hibát fog okozni.
gem install mysql
Ezután, ha nem a legújabb MySQL-t használjuk, vagy az 1.9.1-esnél újabb Rubyt (ami ezen sorok írásakor még nem létezik), akkor megpróbálhatjuk létrehozni az adatbázist, de ne ijedjünk meg ha hibába futunk:
rake db:create
Mivel nem installáltam még ezer gépre, ezer konfigurációban a Railst, ezért csak a saját tapasztalataimat írhatom le, mindenesetre én itt egy olyan hibaüzenetet kaptam, hogy a LIBMYSQL.dll nem található. Némi keresés után azt találtam, hogy a nálam telepített MySQL 5.1.x adatbázis nem kompatibilis a Rails telepítésemmel. A megoldás viszonylag egyszerű, töltsük le a szükséges libmysql.dll fájlt és másoljuk a Ruby bin könyvtárába. Ezután már szépen lefutott a rake parancs és létrejött a fejlesztői adatbázis.
Helló, világ!
Jó programozói szokás szerint, hozzuk létre az első Ruby on Rails alkalmazásunkat, ami kiírja nekünk, hogy "Helló, világ!". Sok értelme persze nincs, de legyünk kockák...
Ehhez feltétlenül kell egy controller és egy view. Legyen a controller a későbbi kezdőlapunk, így adja magát a home nevű controller létrehozása, amit Windows alatt az alábbi paranccsal hozhatunk létre: (Linux alatt a ruby parancs most és a továbbiakban is elhagyható.)
ruby script/generate controller home index
Ha ez lefutott, akkor keressük meg a most generált, megjelenésért felelős sablon fájlt, amit app/views/home/index.html.erb néven találunk meg a projektünkön belül. Vegyük elő minden ötletességünket és írjuk az alábbiakat a fájlba:
<h1>Hello, világ!</h1>
Gyakorlatilag ennyi az egész, de ahhoz, hogy meg is tudjuk nézni az eredményt, még el kell indítanunk a szerver alkalmazást a parancssorból:
ruby script/server
Nálam eltart egy ideig, mire beizzítja magát a Rubyval telepített WEBRick szerver, ezért először azt hittem baj van, de nem. Pár sorban közli a szerver, hogy mit csinál, illetve, hogy a Ctrl+C karakterkombinációval lehet leállítani és a főbb paramétereit. Ekkor nyissuk meg a böngészőben a http://localhost:3000/home/index URL-t, és ha minden igaz, ki is pipálhatjuk a témát.
Azt még említsük meg, hogy a Rails projekt létrehozása után már elindíthattuk volna a szervert és a http://localhost:3000/ cím megnyitásával kaptunk volna egy helyes kis üdvözlő képernyőt. Ez jelezte volna, hogy minden a legnagyobb rendben, a Rails működőképes és a projekt létrejött. Ezt a funkciót mindjárt eltávolítjuk, úgyhogy akit érdekel, az vessen rá egy pillantást most.
Tovább a cél felé
Előszöris az előbb létrehozott home controllert tegyük ténylegesen nyitó oldallá! Ehhez először kitöröljük a public/index.html fájlt, majd megnyitjuk a config/routes.rb fájlt, ami természetesen az aktuális URL-t képezi le egy belépési ponttá, vagyis ennek segítségével határozza meg a Rails, hogy melyik controller melyik actionjét (vagyis függvényét) kell meghívni.
Láthatjuk, hogy a megnyitott fájl tele van # karakterekkel kezdődő komment sorokkal, amik segíthetnek a beállításokban, útmutatást adnak. Nekünk most csak annyi a dolgunk, hogy lehetőleg a kommentek alá, de a meglévő route beállítások fölé beszúrjuk a következő sort:
map.root :controller => "home"
Elvileg készen is vagyunk, ha fut még a szerver, akkor megnyithatjuk a http://localhost:3000/ címet és megkapjuk a szép kis helló-világ alkalmazásunkat. Ha pedig mélyebben elmerülnénk a routes.rb képességeiben és funkciójában, akkor itt egy nagyszerű angol nyelvű leírás.
Kategóriák
A Scaffolding a CodeIgniter használók számára biztosan nem kell bemutatni, de gyanítom sok más keretrendszer használói is ismerhetik a kifejezést. Lényege, hogy mi megadjuk, hogy milyen adatokra lesz szükségünk, a rendszer pedig generál nekünk ehhez egy adminisztrációs felületet. Ahogy a CI esetén magam is megtapasztaltam már, azt mondják a Rails esetében is macerásabb jól testreszabni az így generált alkalmazásrészt, mint megírni az egészet nulláról. Ugyanakkor ez egy olyan területe a Railsnek, amit biztosan nem szabad kihagyni a tanulásból, úgyhogy ismerkedjünk meg vele!
A mostani posztnak nem célja komolyabb tervezéseket elvégezni, úgyhogy csak egy kategóriát és terméket tartalmazó táblát hozunk létre, az azokat összekapcsoló táblát (pivot table) és egyéb adatbázis elemeket a későbbiekre hagyjuk.
Kezdjük a kategóriával, ami egyelőre csak egy névből álljon:
ruby script/generate scaffold Category name:string
Ez a kis parancs egy szép rakás fáljt generál nekünk, köztük egy adatbázis migrációs fájlt is, ami nagyon érdekes, mert olyan formában jön létre, hogy minden változás az adatbázis szerkezetében nyomonkövethető és visszaállítható lesz. A migrációs fájl a db/migrate/ mappában található és az aktuális időbélyeg után a _create_category.rb nevet viseli. Érdemes kicsit tanulmányozni a fájlt, vagy akár többet is megtanulni a Rails adatbázis migrációról.
Vegyük észre, hogy bár mi határozottan egyes számban hoztuk létre a kategória állványát (scaffold=állvány), a létrehozott fájlok többsége viszont többes számban tartalmazza a kategória szót. Ez is a RoR egyik koncepciója, a modelleket egyes számban hozzuk létre, de például az adatbázisban a tábla, vagy a sablonokat tartalmazó mappa többes számot fog kapni. Hozzuk is létre az adattáblát a következő paranccsal:
rake db:migrate
Ha létrejött, linkeljük be a kategóriákat a főoldalra! A views/home/index.html.erb fájl második sorába írjuk a következőt:
<%= link_to "Kategóriák", categories_path %>
Ha leállítottuk már a szervert, akkor indítsuk el újra és próbálgassuk a kategória létrehozási / szerkesztési / törlési képességeinket és veregessük hátba magunkat.
Termékek
A mostani poszt már kezd kezelhetetlen méreteket ölteni ezért már csak a termékek kategóriát hozzuk létre:
ruby script/generate scaffold Product name:string price:float
Ennek az egésznek természetesen nem sok értelme van, ha nem tudjuk hozzárendelni a kategóriákhoz a termékeket és vice versa. Éppen ezért a következő posztot ezzel kezdem, ráadásul nem is kell rá sokat várni.
Címkék:
rails ruby