12 Mart 2008 Çarşamba

004. Yeni Sayfalar Ekleyelim

Projemizin dosya yapısında app/view dizini altında layouts hariç her bir dizin aslında bir controller ismidir. Mesela bizim projemizde kullandığımız controller'ın ismi cds. Bu klasörün altındaki .html.erb uzantılı dosyalar scaffold komutuyla otomatik olarak yaratılmıştı. Ancak biz istersek bu klasörün altına yeni .html.erb dosyaları yaratarak aynı controller'a bağlı yeni view dosyaları, dolayısıyla sayfaları oluşturabiliriz.

Bu yazının amacı yeni dosyaları bu şekilde oluşturmak yerine controller yaratırken otomatik oluşturmayı göstermek ve link_to komutunu tanıtmak olacak.

Hatırlarsanız scaffold işlemini yaparken komutumuzun başlangıcı script/generate olarak yazılıyordu. (Windows kullanıcıları bunun başına ruby koymak zorunda, yani ruby script/generate şeklinde. Linux kullanıcıları da isterlerse koyabilirler ancak kodu uzatmaktan başka bir faydası yok.) Program geliştiricilerinin ellerinin altında her zaman olması gereken araçlar vardır. Mesela IDE, css editor v.s. İşte rails geliştiricilerinin sık sık kullandığı araçlar arasında script/generate ve rake vardır. Rake'i daha sonra anlatacağız ancak bu yazıda biraz script/generate den bahsedelim.

Script/generate
Diğer Ruby ve Rails komutları gibi ismiyle örtüşen bir işlevi vardır, kendisinden sonra belirtilen işlemin betiğini üretir. 002 numaralı yazıda kullandığımız komutta bu betik scaffold du ancak her zaman scaffold olmak zorunda değil. script/generate ile controller, model gibi ruby yapılarını da üretebiliriz.

Komuttan sonra üretilecek yapının türü, yapının adı ve varsa parametreleri girilir. Örneğin hatırlarsanız 002 numaralı derste verdiğimiz komut
script/generate scaffold Cd baslik:string aciklama:text yer:string
şeklindeydi. Burada scaffold yaratmak istediğimiz yapının türünü, Cd yapının ismini, daha sonra gelen parametler ise yaratılacak veritabanı modelinde kullanacağımız alanları ve alan türlerini gösteriyor.

Controller da benzer şekilde yaratılıyor. Örneğin bu yazıda "ben" isimli bir controller yaratacağız ve bu controller a bağlı "hakkımda" ve "iletişim" isimli iki adet sayfamızın olmasını sağlayacağız. Normalde "ben" isimli bir controller yaratmak için vereceğimiz komut
script/generate controller Ben
şeklinde olması gerekiyor. Ancak biz bu controller ile birlikte, bu controller'a bağlı olacak sayfaları da yaratmak istediğimizden parametre olarak bu sayfaların isimlerini de aşağıdaki gibi geçirebiliriz.
script/generate controller Ben hakkimda iletisim
Bu aşamada tarayıcımızın adres satırına "http://localhost:3000/ben/hakkimda" ya da "http://localhost:3000/ben/iletisim" yazarak sonuçları görebilirsiniz. Eğer tarayıcı hata verdiyse webrick server'ın çalışıyor olduğundan emin olun. Çalışmıyorsa "script/server" komutuyla server'ı başlatın.

Dikkat ettiyseniz app/view klasörü altında hakkimda.html.erb ve iletisim.html.rb isimli iki dosya "ben" isimli dizin içerisinde yaratıldı. Ayrıca ben_controller.rb isimli dosyamızda app/controllers dizinine yaratıldı.
Burada her iki view içinde birer fonksiyon tanımlı olduğunu görüyoruz. Bu fonksiyonların içerisine bu görünümlerle ilgili programatik herşeyi tanımlayabiliriz. Controller'lardan daha sonra ayrıntılı olarak bahsedeceğim için bu kısmı detaylara inmeden geçiyorum, ancak küçük bir ipucu olması açısından @title ve @zaman isimli iki değişkenin .html.erb dosyalarına nasıl aktarıldığını göstreeceğim. ben_controller.rb dizinini aşağıdaki gibi değiştirelim.

class BenController < ApplicationController

def hakkimda
@title="Hakkımda"
@zaman= Time.now.to_s
end

def iletisim
@title="İletişim"
@zaman=Time.now.to_s
end
end
hakkimda ve iletisim isimli fonksiyonların içindeki "@" karakteriyle başlayan title değişkenine sayfa başlığını, zaman isimli değişkene de "Time.now.to_s" isimli komut yardımıyla o anki zamanı atadık. Bunları ilgili .html.erb dosyaları içerinde < % = ve % > blokları arasında kullanabileceğiz.


hakkimda.html.erb isimli dosyayı aşağıdaki gibi değiştirelim.

<%= @title %>


Hakkmda yazacagim seyler buraya gelecek.


Su an saat: <%= @zaman %>

iletisim.html.erb isimli dosyayı da aşağıdaki gibi değiştirelim.

<%= @title %>


Geçerli zaman: <%= @zaman %>


İletişim Bilgilerim buraya gelecek...

link_to
Basitce bir bağlantı yaratmak için kullanılan Rails komutudur. Çeşitli kullanımları mevcuttur. en yaygın olarak kullanım şekilleri aşağıdaki gibidir.

<%= link_to "link text...", :action => "index" %>
<%= link_to "link text...", :action => "edit", :id => @item %>
<%= link_to "link text...", :controller => "items" %>
<%= link_to "link text...", :controller => "items", :action => "index" %>

Ancak biz sayfamızın üst kısmındaki gezinti bölümünde kullanacağımız için link_to komutunun özel bir türevi olan link_to_unless_current komutunu kullanacağız.

<%= link_to_unless_current("Ana Sayfa", { :controller => "cds", :action => "index" }) %>
Yukarıdaki komut eğer kullanıcı hali hazırda "cds/index" sayfasında değilde "cds/index" sayfasına bir bağlantı oluşturur, aksi takdirde bağlantı oluşturmadan sadece "Ana Sayfa" yazar. Sanırım geri kalanı yeterince açık.

Bunu layouts klasörü içerisindeki cds.html.erb içinde üst kısımdaki gezinti çubuğunun olduğu yere aşağıdaki gibi uyguluyoruz.
<%= link_to_unless_current("Ana Sayfa", { :controller => "cds", :action => "index" }) %> |
<%= link_to_unless_current("Hakkımda", { :controller => "ben", :action => "hakkimda" }) %> |
<%= link_to_unless_current("İletişim", { :controller => "ben", :action => "iletisim" }) %>
Bu işlemden sonra cds.htm.erb dosyasının aynısından bir de ben.html.erb dosyası yaratarak yine layouts dizinine atıyoruz, çünkü yeni yarattığımız controller ve view'lerin de kullanmak için kendi isimlerini aradıkları bir layout dosyasına ihtiyaçları var. Aslında bunu yapmanın daha pratik yolları var, fakat bunlardan ileride bahsedeceğim.

Tüm bunları yaptıktan sonra sitemizde özet olarak;
  • script/generate'i anladık,
  • Fazladan bir controller ekledik,
  • Fazladan iki sayfa ekledik,
  • Controller'dan sayfalara değişken geçirdik,
  • link_to komutunun ne iş yaptığını anladık,
  • link_to_unless_current komutunu kullanarak gezinti çubuğunu işlevselleştirdik
Bunlara ilave olarak açık kaynak olarak aldığımız site tasarımımızın İngilizce olan arayüzünü, copyright şartı olan bağlantıyı koruyarak Türkçeleştirdim. Bu yazıda anlattıklarımı uyguladığım projenin son halini bilgisayarınıza indirmek için buradan buyurun...

Sürç'ü Lisan ettiysek affola, bir sonraki yazıda görüşmek üzere kalın sağlıcakla...