Nagy projekt első rész
Itt a hétvége van időm postot írni. Most egy több részes projektbe fogok belekezdeni. Nagy vonalakban lesz benne, alap kinézet, rendering, felhasználó kezelés és egyéb finomságok. Olyan dolgok amik minden oldalhoz szükségesek lehetnek.
Kezdjük el, csináljunk egy új projektet a Netbeansben, majd állítsuk meg a db konfigurációkat. Én most mysqlt fogok használni, de nyugodtan lehet használni sql-lite-ot is. Legyen a projektünk neve mondjuk MovieDb.
Először csináljunk egy kezdetleges layoutot neki. Mi is az a layout? A layout egy alap kinézet, keret ahova mindig betöltjük a megfelelő tartalmakat a megfelelő helyre. Ha megnézzük, a views mappát, akkor láthatjuk hogy van ott egy layouts mappa. Minden layoutot ide kell pakolnunk. Csináljunk is gyorsan egyet, jobb gomb a layouts mappára, és new ERB, aminek a neve legyen application.html.erb. Egyenlőre ennek a tartalma teljesen alap, majd később megszépítjük, most csak a funkcionalitásra figyelünk.
<html>
<head>
<title>Filmek adatbázisa</title>
</head>
<body>
<%= yield %>
</body>
</html>
Egyenlőre ennyi. No de mi aza <%= yield %>? Szépen lefordítva kihozatalt jelent. Railsben, minden egyes tartalmat amit ebbe a layoutban akarunk megjeleníteni, ennek a helyere illeszt be. Később hozzáadunk többet is. (Tudom, mindig azt mondom, hogy majd később, csak ugye nem lehet egyszerre mindent leírni )
Most csináljunk egy movie modellt. Legyen benne egyenlőre, egy id, amit nekünk nem kell külön definiálni, mert ez alap, legyen egy cim, és egy leírás rész, ahogy korábban a scaffoldnál volt. Nos akkor generate -> model. Létrejött 3 db fájlunk. Migrate, egy test és maga a model. Töltsük ki a migrate fájlt, ahogy előbb írtam.
class CreateMovies < ActiveRecord::Migration def self.up create_table :movies do |t| t.string :cim t.string :leiras t.timestamps end end def self.down drop_table :movies end end
Most migrate database. Ezzel kész is vagyunk. Most csináljunk egy controllert, mondjuk movies néven. Adjuk meg azoknak a metódusoknak a neveit, amiről úgy gondoljuk, hogy lesz hozzá view, mert akkor ezeket is le generálja nekünk a Netbeans. Ezek most az index, new és edit. Az indexnél mi szeretnénk az összes dbben lévő rekordot kitolni. Ehhez ugye meg kell keresnünk őket és belerakni egy változóba. Nekünk olyan változó kéne amit megtudunk hívni a viewból. Ezeket @ jelel kell kezdeni, pl: @valtozo (objektum példány változója), ha simán csak valtozo akkor azt csak a methóduson belül tudjuk kezelni(lokális), ha @@valtozo akkor az osztály változó, ha pedig $valtozo, akkor az globális. Szóval akkor most csináljunk egy @movies változót amit fel kéne tölteni adatokkal. Ehhez szükségünk lesz a Movie modellen keresztül az adatokra. Ahogy a scaffoldnál már néztük ide egy find(:all) kell.
Ahhoz, hogy megjelenítsük ebből a hashből az adatokat, szépen egyessével végig kell lépkedni rajtuk, vagy egy for, vagy each cikklussal, vagy csinálunk egy partial-t aminek megadjuk, hogy milyen collectionből szedje az adatokat. Én most a partialt fogom választani, igaz ez meg jelenítésben lassabb, viszont kényelmesebb. Szóval most ne foglalkozzunk még a teljesítménnyel azzal ráérünk később is. A partialok egy-egy részelemek amiket bármelyik oldalba betudunk “renderelni”. A partalokról még annyit érdemes tudni, hogy a nevük mindig alul vonással kezdődik. Csináljunk egy _index partialt a movies mappába. Ennek a tartalma pedig
<tr>
<td><%= index.cim %></td>
<td><%= index.leiras %></td>
</tr>
a partialokban megjelenítendő adatoknak a szülő eleme mindig a partial neve kell hogy legyen. Most készítsük el a az index.htmlt
<table>
<tr>
<th>Cím:</th>
<th>Leírás:</th>
</tr>
<%= render :partial=>”index”, :collection=>@movies%>
</table>
Most állítsuk be, hogy REST legyen az alkalmazásunk, és hogy ez a movies/index legyen a kezdő oldal. Nyissuk meg a config/routers.rb-t és adjuk hozzá a következő két sort:
map.resources :movies map.index '/', :controller=>"movies", :action=>"index"
Ezek után töröljük ki a public könyvtárból az index.htmlt.
Most nézzük meg mit csináltunk. Ha mindent jól csináltunk akkor megjelenik a cím: leírás:. Adjunk, az indexhez hozzá egy új linket. Amivel meg hívjuk a new metódust.
<%= link_to “Új”, new_movie_path %>
Egy két Netbeans trükk, rhtmlnél: lia + Tab, re + Tab, r + Tab, .rbknél, def + tab, mindenhol: ctrl + shift + f. Van még sok, majd mindig megpróbálom írni ami éppen kezembe akad.
Most készítsük el a new.html.erb-t ugye ide kell nekünk egy form, amit kitöltve hozzáadunk egy új elemet a dbhez.
<%= error_messages_for :movies %>
<% form_for :movie, :url=>movies_path do |m|%>
<p> <%= m.label(:cin,”Cím: “) %>
<%= m.text_field(:cim) %></p>
<p>
<%= m.label(:leiras, “Leírás: “) %>
<%= m.text_area(:leiras) %>
</p>
<%= submit_tag “Mentés” %>
<% end %>
edit.html.erb
<%= error_messages_for :movies %>
<% form_for :movie, :url=>movie_path(@movie), :html=>{:method=>:put} do |m|%>
<p> <%= m.label(:cin,”Cím: “) %>
<%= m.text_field(:cim) %></p>
<p>
<%= m.label(:leiras, “Leírás: “) %>
<%= m.text_area(:leiras) %>
</p>
<%= submit_tag “Mentés” %>
<% end %>
Módosított, _index.html.erb
<tr>
<td><%= index.cim %></td>
<td><%= index.leiras %></td>
<td><%= link_to “Szerkesztés”, edit_movie_path(index) %></td>
<td> <%= link_to “Törlés”, movie_url(index), :method => :delete, :confirm=>”Biztos törölni akarja?” %></td>
</tr>
Módosított movies controller:
class MoviesController < ApplicationController def index @movies = Movie.find(:all) end def new @movie = Movie.new end def create @movie = Movie.new(params[:movie]) @movie.save flash[:notice] = "Sikeresen létrehozva" redirect_to movies_path rescue ActiveRecord::RecordInvalid flash[:error] = "Valami hiba lépett fel" redirect_to new_movie_path end def edit @movie = Movie.find(params[:id].to_i) end def update @movie = Movie.find(params[:id].to_i) @movie.update_attributes(params[:movie]) flash[:notice] = "Sikeresen frissítve" redirect_to movies_path rescue ActiveRecord::RecordInvalid flash[:error] = "Valami hiba lépett fel" redirect_to edit_movie_path(@movie) end def destroy Movie.find(params[:id].to_i).destroy redirect_to movies_path end end
Ezzel, most nagy vonalakban azt csináltuk meg mint a scaffoldal, így sokan mondhatják, hogy hát nem is haladtunk semmit sem előre, de azét ez nem így van, mert a folytatásban ezt fogjuk tovább pofozni. Látható, hogy benne vannak olyan dolgok amik még inaktívak, mint pl a flashek. Mikor még lesz időm, hozzá fogok lehet tűzni egy-két képet. Mára ennyi. Hamarosan folytatódik.
júl14











július 17, 2008 at 10:09 de.
Szuper! Várom a folytatást.
augusztus 23, 2008 at 8:27 du.
Na en itt szivtam rendesen mire rajottem, hogy a routes.rb-ben a REST-es definicio a default “:controller/:action/:id” sorok ELE kell, hogy keruljon…
Egyebkent hajra, ez a tutorial a maga nemeben egyedulallo;)
szeptember 3, 2008 at 5:05 du.
Sry, azt tényleg nem írtam, hogy azt oda kell. Remélem nem negatív értelemben egyedülálló.
december 17, 2008 at 2:57 de.
” ha pedig &valtozo, akkor az globális”
bocs de ez nem $valtozo?
december 17, 2008 at 10:38 de.
de
május 17, 2009 at 11:23 du.
megint én. nekiálltam egy projectnek, de már az elején elakadtam. hiába állitom be a REST-et nem akarja a jót. megadtam indexnek egy controllert és actiont de semmi 500as hibát dob…:( mit rontok el?