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 &lt; 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=&gt;"movies", :action=&gt;"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 &lt; 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

6 Responses to “Nagy projekt első rész”

  1. Legionnaire Says:
    július 17, 2008 at 10:09 de.

    Szuper! Várom a folytatást. :)

  2. 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;)

  3. Sry, azt tényleg nem írtam, hogy azt oda kell. Remélem nem negatív értelemben egyedülálló. :)

  4. ” ha pedig &valtozo, akkor az globális”

    bocs de ez nem $valtozo?

  5. de

  6. 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?

Leave a Reply