Első Rails App
Filed under Rails
Eljött az idő, hogy megcsináljuk az első Ruby on Rails oldalunkat. Én netbeansben fogom csinálni, de igyekszem azok számára is érthetően leírni akik irkálják a terminálba a parancsot.
Akkor nyissuk meg a Netbeanst és nyomjunk egy File-> New Projectet.
Ezek után állítsuk be, hogy a sima Ruby-t használjuk és ne a JRubyt, majd tovább és válasszuk ki hogy milyen adatbázist akarunk használni. Ha mysqlt használunk akkor értelem szerűen kikell tölteni a mezőket. Én most az sqlite3-at választottam mert most ez a legkénylmesebb.
Aki parancs szavazik annak, egyenlőre csak egy rails ElsoOldal -t kell lefutattni.
Nézzük végig mit is csinált nekünk ide a Netbeans, meg ez a kis parancsszó.
Netbeansben a bal oldalon a project résznél látjuk, hogy sok mappa létrejött. Ezek sorban:
Controllers. Ide jönnek majd értelem szerűen a cotrollerek, mappa szinten ez a app/controllers rész.
Helpers (app/helpers) ide jönnek majd a helperek, amikbe minden olyan metódus jön amit a view (template) -ből akarunk meghívni. Ez azért jó mert nem rakjuk tele mindenféle kesze-kusza dologgal a viewnkat.
Models(app/models) idejönnek a modellek.
Views(app/views) ide jön minden ami a megjelenítéshez kellhet. Korábban .rhtm .rxml .rjs stb. volt a kiterjesztés, de ezeket a 2.0 óta kicsit megváltoztatták, persze még most is működnek ezek a kiterjesztések, de azért érdemes átérni az új szabványokra. Ami nem más, mint html.erb js.erb xml.erb stb.
Ezzel bezárult az app mappa felépítése. Az app mappában van az oldalunk szíve-lelke. Nézzük tovább a szerkezetet.
Configuration(config), na vajon mik vannak itt?
A konfigurációs fájlok. nézzük sorba.
boot.rb na ez az amihez szinte soha sem kell nyúlnunk ebben vannak deffiniálva az inicializáláshoz szükséges dolgok (konstansok, mi hol merre van stb).
datbase.yml ez viszont annál fontosabb, mert ezzel kell szinte mindig kezdeni a munkát mikor csinálunk egy új appot. Ez 3 részből áll development, test, production. Mindegyiknél meg kell adni a megfelelő beállításokat, lehet ugyanazt a dbt is használni de ez nem ajánlott. Úgy hogy ne legyünk restek ezeket szépen beállítani.
environment.rb itt adhatjuk meg hogy éppen milyen versióval dolgozhatunk, milyen módban fut az alkalmazásunk (production, development), és ezenkívül mindent amit szeretnénk , hogy betöltődjön mikor indul az alkalmazásunk, mivel ez fut le majdnem legelőszőr. Meg még nagyon sok mindent állíthatunk de ezeket majd ha szükségünk lesz rá.
routers.rb itt adhatjuk meg, hogy mi hol van, hogyha egyedileg akarjuk megjeleníteni, meg persze az alap url térképet is, hogy a böngészők hogyan jelenítsék ezeket meg. Amikor a RESTről fogok majd írni akkor sztem mélyebben megmutatom mi hogy, meg persze folyamatában sokat fogunk itt matatni.
Van még két mappánk a configon belül, de ezekkel most nem foglalkozok, hogy haladjunk.
Database Migrations(db/migrations) ide kerülnek a migrációs filelok, ezeknek a szerepe az, hogy mikor létrehozunk egy modellt, akkor létrejön egy migrációs file is, amibe szépen meg tudjuk adni rubyul, hogy hogy nézzen ki a db táblánk, és nem kell szenvedni sqlben hogy create table valami…..
Libs(lib) ide jön minden egyedi osztály include file stb.
Logs(log) értelem szerűen a logok.
Public statikus tartalmak helye.
Következnek a test mappák, scripts,documentation, vendor, ezekről később.
Térjünk vissza a projekthez.
Indítsuk el a szerverünket és nézzük meg mit kell látnunk. Netbeansben fönt zöld play gomb, vagy F6 vagy Run->Run main project. Terminalban script/server.
Ha ezeket látjuk akkor jók vagyunk.

Mit is csináljunk, most itt a szimpla “blog” motoros dolog, helyett csináljunk valami mást, persze csak a neve lesz más az elv ugyanaz.
Scaffoldoljunk. A scaffolding egy jó dolog, de szerintem nem sokan használják az alap scaffoldot produkciós környezetben. A scaffolddal szépen letudjuk generálni egy modlere az alap CRUD(create read update delete) elv alapján az oldalainkat. Ezzel elősszőr gyorsan tudunk haladni, és néha alap váz felépítése jó vele, viszont valamikor a testre szabás több időt vesz el mintha magunk megírtuk volna.
Csináljunk akkor egy filmes adatbázist. Bökjünk rá jobb gombal a projects panelban a nevére a projektunknak és válasszuk ki a generate… menüt. A legördülő menüből válasszük ki a scaffoldot majd adjuk meg a nevét a modellünknek. legyen ez Movie, majd szépen sorban, hogy milyen oszlopokat akarunk a db táblába és ezeknek mi legyen a típusa. Legyen egy cim:string és leiras:text típusunk.
script/generate scaffold Movie cim:string leiras:text. Most legyártott nekünk egy rakat fájlt. Kaptunk movies controllert,helpert, modelt, meg a view mappában is létrejött egy movies mappa azon belül pedig a html.erb fileok. Nomeg persze a teszt és migrációs fileok is létrejöttek. Elősszőr is nézzük meg, hogy mi van a migrációs fájlunkban.
class CreateMovies < ActiveRecord::Migration def self.up create_table :movies do |t| t.string :cim t.text :leiras t.timestamps end end def self.down drop_table :movies end end
Van ugye egy CreateMovies osztalyunk ami az ActiveRecord::Migrationből lett származtatva. Az ActiveRecord felelős minden db, modellel kapcsolatos dologért.
Van két metódosunk egy self.up és self.down ugye az up akkor fut le mikor lefuttatjuk a migrációs filet, viszont ezt vissza is tudjunk vonni, visszalépni.
Van egy create_table parancsunk ezzel értelem szerűen létre tudjuk hozni a táblát. A tábla mezőket, pedig a do |valami| end között tudjuk megadni. A valami itt speciel t de lehetne ez dzs is. Ezen belül szépen megadjuk a mezőket. A timestampsel léterhozunk automatikusan egy created_at és updated_at nevű mezőt amiknek a típusa datetime.
Na futtassuk le jobb gomb a project nevére és migrate database to current versiont. Láthatjuk, hogy létrejött a dbnk és benne a tábla.
Ha most megnézzük a böngészőnkben a http://localhost:3000/movies -t akkor látni fogjuk hogy létrehozhatunk új filmet, szerkeszthetjük stb. Nézzük hogy épül fel az egész. Mivel ugye a routerünkben az alap beállítások vannak ezért minden úgy fog megjelenni, hogy lovalhost:3000/controllerneve/methodneve(nemmindig, index, shownal nem jelenik meg)/id(ha van) és ugye láthatjuk még hogy a routersben létrejött még egy map.resources :movies, ezzel adtuk meg hogy a movies controllert REST “módban” használjuk.Az hogy mi a REST kicsit később. Nézzük meg a controllerünk. Látunk sok metódust. index, show, new, edit update, create, destroy. Nézzük meg a Views mappánkat. Ott látunk egy movies mappát, mivel minden egyes controllerhez tartozik egy mappa, ahol a metódusokhoz tartozó view-k vannak. Itt viszont csak edit, index, new, show-t látunk, miért lehet ez? Azért mert ha megnézzük a controllerben akkor a create, update és destroy, methodusok redirektelve vannak, azaz nekik nem kell view.
Nézzük a metódusokat mit csinálnak.
def index @movies = Movie.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @movies } end end
Létrehozunk egy változot aminek a neve movies. Ebbe beletoljuk az össze filemet, amit a Movie modellen kereszül keresünk ki a dbből. Ugye ennek az sql megfelelője select * from movies; lenne itt most csak ennyi. Ezt nekünk mindd az ActiveRecord generálja.
Ezután megadjuk, hogy a válasz milyen kérésre, hogy nézzen ki. Ha sima html akkor megnyitja az index.html.erbt hogyha a kérés movies.xml ként jön akkor a @movies objektumot ki rendereli mint xml.
Az index.html.erb tartalma:
<h1>Listing movies</h1>
<table>
<tr>
<th>Cim</th>
<th>Leiras</th>
</tr>
<% for movie in @movies %>
<tr>
<td><%=h movie.cim %></td>
<td><%=h movie.leiras %></td>
<td><%= link_to ‘Show’, movie %></td>
<td><%= link_to ‘Edit’, edit_movie_path(movie) %></td>
<td><%= link_to ‘Destroy’, movie, :confirm => ‘Are you sure?’, :method => :delete %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to ‘New movie’, new_movie_path %>
Ugye vannak az alap html tagek, majd látja mindenki, hogy vannak benne <%%> <%= %> ezek, nem jsp tagek, hanem Rails tagek. Ha <%%> akkor az a kimeneten nem fog látszani, <%= %> akkor viszont fog. Van nekünk itt egy for ciklusunk ami kicsit más mint az alap c, vagy java stílusú nyelvekben. <% for movie in @movies %> ez ugye nem megy ki a kimenetre, és van egy <%end%> párja. Ez a for úgy működik, hogy egészen addig fog lépegetni amíg a @moviesban van elem, az hogy a for után milyen név van teljesen mindegy lehetne blab is, csak akkor ugye akkor a címre blab.cim ként kell hivatkozni.
A for-on belül ugye kiírjuk a táblázat oszlopaiba a megfelelő tartalmat. A h paraméter annyit csinál, hogyha valaki html kódot vagy bármit ami kacsacsőrrel van akkor azt kiveszi. Ez nem a legbiztonságosabb megoldás az oldal védelme szempontjából de kezdetnek megteszi. Ezután kitoljuk a címet, és másikba a leírást. Ezután jön egy <%= link_to ‘Show’, movie %> Ez egy alapértelmezett Rails helper metódus. Ezzel tudunk linkeket generálni. link_to “megjelenitett szoveg”, :controller=>”movies”, :action=>”valami”. Alapból így nézz ki, de mivel nekünk a scaffold most beállította a, hogy Rest legyen ez a controller ezért itt most a movie szerepel. Következő postokban ezekről bővebben is fogok beszélni.
Gyorsan nézzük meg a new.html.erb-t mert az még érdekes lehet.
<h1>New movie</h1>
<% form_for(@movie) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :cim %><br />
<%= f.text_field :cim %>
</p>
<p>
<%= f.label :leiras %><br />
<%= f.text_field :leiras %>
</p>
<p>
<%= f.submit “Create” %>
</p>
<% end %>
<%= link_to ‘Back’, movies_path %>
Itt van egy olyan helper metódusunk hogy form_for, ezzel tudunk formot generálni. Jobban most ebbe nem mennék bele mert a scaffold miatt ez most REST és így elsőre bonyolultabb innen kezdeni. Ezért most ezt a nem rövid postot le is zárnám.
Remélem azért az alap szintaktika felépítés mindenkinek látszik, és az is látszik, hogy a scaffold látványos meg jó de sok munka van még vele, mert pl mindent magyarosítani, meg átrendezgetni, elnevezni, dobozolni stb. Nagyobb munka mintha magunk írnánk meg ezeket.
Elnézést mindenkitől, hogy ilyen hosszúra nyúlt, viszont próbáltam bizonyos dolgokat minél részletesebben leírni, ezért kicsit összevissza lett. Majd ha jönnek visszajelzések akkor tudom, hogy majd ezek után mennyire kell dolgokat részletesen leírnom.
júl03















július 3, 2008 at 10:16 du.
Üdv!
“Netbeansben a jobb oldalon a project résznél látjuk, hogy sok mappa létrejött. Ezek sorban:”
a pikcsörön ez bal oldalon helyezkedik el
Egyébként nagyon jó ötletnek tartom az oldalt, sok sikert a továbbiakban!
július 3, 2008 at 10:48 du.
hupsz…
igazad van javítom, thx
július 4, 2008 at 1:36 du.
Jó ötlet! sok sikert! Remélem sok jó cikk születik még a billentyűzetetből:)
július 4, 2008 at 3:27 du.
Köszi, igyekszem
július 5, 2008 at 9:47 du.
megpróbáltam a leírásod alapján (OSX Leopard alatt csináltam először), de a scaffold résznél már elakadtam, a Netbeans 6.1-esben a generate scaffold alatt nem “Model” és “Attribute pairs” mezők vannak, hanem “Model”, “Controller” és “Actions” mezők.
PC-n úgy van ahogy írod (Model name és Attribute Pairs).
július 5, 2008 at 9:57 du.
hmm érdekes, mert én is Leopard alatt és 6.1es netbeansel csinaltam amint a képen is látható. Most gyorsan ránéztem, egy két paraméterre, de nem sikerült előidéznem ezt a elrendezést. légyszi dobj egy screenshotot a pepusz kukac gmail re,és akkor hátha többet tudok segíteni
július 5, 2008 at 11:01 du.
mail ment