Artık iyiden iyiye
rails'a merak saldım. Artık bu sayfada zaman buldukça döküman yazıp eklemeye çalışacağım.
RUBY ON RAILS ILE YAZILIM GELISTIRMEYE BAŞLANGIÇ
Öncelikle yeni bir rails dosyasına başlanılır. Programı nerede oluşturacaksak o klasörde
rails ProgramAdi
şeklinde yeni bir program oluşturulur. Bu şekilde belli dosyalar oluşmuş olacaktır.
Rails programları şu üç türden oluşmaktadır.
MVC -> MODEL VIEW CONTROLLER
MODEL -> Veritabanı ilişkiler
VIEW -> Sayfanın görünümsel dosyaları
CONTROLLER -> Veritabanı ve görünüm arasındaki ilişki
Yeni bir conntrollerin ( bundan sonra denetleyici olarak geçecek ) ve modelin ( bundan sonra şablon olarak geçecek ) oluşturulması gerekir. View ise ( bundan sonra görünüm olarak geçecek ) bir denetleyiciye ait görünüm dosyasıdır. Uzantıları "rhtml" biçimindedir. Örneğin http://adresiniz/deneme adresi için tasarınızın dizinindeki view dizininde "deneme.rhtml" oluşturursanız ve denetleyiciye "deneme" biçiminde bir istek alımcısı belirtseniz rails bunu sizin yerinize koyacaktır.
Yeni bir denetleyici ve model oluşumu
Aslında bir denetleyici ve model oluşturmak için gerekli dosyaları oluşturmak yeterlidir. Fakat bunu sizin yerinize rails yapabilir. Tasarınızın bulunduğu klasöre giderek
kullanım: ruby script/generate TUR isim
şablon (model): rubu script/generate model Isim
denetleyici (controller): ruby script/generate controller isim
Not: şablon isimleri ilk harfi büyük şekilde başlamalıdır.
[DOĞRU] Murat Isim
[YANLIŞ] MURAT isim murat
Not 2: Şablon isminin veritabanındaki tablo ile ilgili isme sahip olması yararlıdır. Zira karıştırma olasılığı azalır.
Denetleyici neyi denetleyecek, neye bağlı kalacak?
Denetleyici (controller) sayfadan gelen kullanıcı isteklerini kontrol eder, bunları şablona (modele) iletir. Gelen verileri ayarlar, işlemlerini yapar. Bunları görüntüsel hale çevirmek "görünüm"ün işidir. Rails ile bir veritabanı kullanan yazılım geliştirmek bu mantığa dayanır. Veritabanını ayarlar, Tabloyu belirt (not: rails şu anda 6 kadar veritabanı desteklemektedir.), Verileri süz, gelen isteğe cevap ver, bunları kullanıcın görebileceği görüntüsel hale çevir.
İçerik Sistemi
Bir programlama dili öğrenirken izlediğim yol her zaman dilin belli kurallarını öğrendikten sonra hemen örnek kodları incelemektir. O dil ile yapılmış ufağından başlayarak büyüğüne doğru yazılımları inceleyerek bir fikir sahibi olurum zaten onları incelerken hangi fonksiyonun ne iş yaptığı meydana çıkar. Bunun için bizde rails üzerinden bir içerik sistemi geliştirelim. Belki tam bir içerik sistemi olmasa bile en azından günlük notlar alabileceğiniz bir "blog" sistemi. Bunun için yeni bir yazılıma başlayacağımızı railse bildirelim ki o da bizim için gerekli olan dosyaları oluştursun. Tasarıyı oluşturacağımız klasöre gidip
rails icerik
komutunu veriyoruz.
bizim için components , db, lib, public, test, app, config, doc, log, script, vendor klasörlerini oluşturdu. Kısaca;
public -> sayfamızdaki resimlerin, css dosyalarının ve diğer tüm dosyaların (yazılımdan başka) bulunduğu dizindir.
config -> programın veritabansal ayarının yapıldığı dosyaların bulunduğu dizin.
script -> railsin çalışması için gerekli olan ruby dosyaları.
app -> tüm yazılımızı geliştireceğimiz yer.
şimdi railsin çalışıp çalışmadığını kontrol edelim. oluşturduğumuz klasörde
ruby script/server
komutunu çalıştırarak WEBRick sunucusunu çalıştırıyoruz. (Rails dosyaları bir çok sunucuda çalışabilir. Örnek ayarlar ilerleyen bölümlerde yer alacaktır.) Kısaca webrick sunucusu bizim kodları test edebilmemiz için 3000. portta yer alır. Ruby ile oluşturulmuştur. Şimdi http://localhost:3000/ yazarak sunucumuza bağlanabiliriz. İçerik sistemine bağlanmak için http://localhost:3000/icerik/ adresini deneyebiliriz. Adrese girdiğimiz zaman bize hata verecektir. Çünkü henüz içerik için herhangi bir şablon ve denetleyici belirtmedik. Fakat öncelikle içerik sisteminin olduğu veritabanını oluşturup bunu railse bildirmemiz gerekiyor. Bu sistem için ben mysql kullanacağım. (Not: Veritabanı değişimi için tek yapmanız gereken bunu railse bildirmenizdir.) Örneğin "icerik" veritabanında "icerikler" adlı tablo oluşturdum.
CREATE DATABASE 'icerik';
CREATE TABLE `icerikler` (
`id` int(11) NOT NULL auto_increment,
`icerik_basligi` varchar(200) NOT NULL default '',
`icerik` longtext NOT NULL,
`yazilma_tarihi` datetime NOT NULL default '0000-00-00 00:00:00',
`icerik_kategorisi` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1
;
Şimdi rails programında veritabanı ayarlarını yapabiliriz. "config" klasöründeki "database.yml" dosyasına bunu belirtelim. ( NOT: YML Dosya biçimi yanl dilinde yazılmıştır. www.yaml.org )
development:
adapter: mysql # VERITABANI TÜRÜ
database: icerik # VERITABANI
host: localhost # SUNUCU ADRESI
username: root # KULLANICI ADI
password: # KULLANICIYA AIT SIFRE
Veritabanı ayarlarını yaptık artık bu veritabanındaki tabloyu işlemek üzere bir şablonumuz ve bu ilişkiyi ayarlayan bir denetleyicimiz lazım. (View en son sayfa görünümü için gerekli olacağından yeri geldiğince ayarlanacaktır.)
Öncelikle bir şablon oluşturmamız gerekiyor. Şablonun ilk harfi mutlaka büyük harf ile başlamalıdır. Kullanılabilirlik açısından tablo ile ilgili bir isim olması faydalıdır. Biz tablomuza icerik adını koyduğumuza göre şablon adımızı icerik olarak koyabiliriz. Tekrar tasarımızın olduğunu klasöre gidiyoruz ve railse bize bir şablon oluşturmasını söylüyoruz.
ruby script/generate model Icerik
Yapılan iş railsin kodlarından bize gerekli olan klasör ve dosyaları oluşturtturmak. Rails ruby üzerine kurulu olduğu için ruby ye script klasöründeki generate dosyasına erişip bize icerik adında model oluştur diyoruz. Oda bize gerekli klasör ve dosyaları oluşturuyor. Şimdi bu model ile kullanılmak üzere birde denetleyici oluşturalım. Denetleyici isimleri küçük harf ile başlamalıdır. Denetleyici hangi şablonu daha çok kullanacak ise karıştırmamak amacıyla şablon ile aynı ismi vermek mantıklıdır.
ruby script/generate controller icerik
Aynı şekilde oda bizim için gerekli dosyaları oluşturdu. Şimdi denetleyicinin hangi modele ait olduğunu belirtelim. Denetleyicilerin bulunduğu yere giderek (tasarı klasörü/app/controllers) oluşturduğumuz denetleyici dosyasını açalım. (ISIM.rb şeklinde) biz icerik olarak oluşturduğumuz için " icerik.rb " dosyasını açıyoruz. Class yapısınıdan sonra
model :icerik
şeklinde bunun "icerik" şablonuna ait olduğunu belirtiyoruz. burada şablonumuzun adı her zaman küçük harfle yazılmalıdır. Şimdi sayfamıza baktığımız zaman (http://localhost:3000/icerik) bilinmeyen eylem hatası aldığımızı görüyoruz. demek oluyor ki şimdilik sorunsuz gidiyoruz. Hata aldık nasıl sorunsuz gidiyoruz derseniz railsde bir sorun yok çünkü biz denetleyicimize ana sayfada ne yapması gerektiğini söylemedik. Ana sayfada (index genel tabirdir.) n'apması gerektiğini denetleyicimize bildirelim. Aynı dosyada;
def index
render_text("Icerik Sisteminden Merhabalar!")
end
yazalım. Şimdi sayfaya açtığımız icerik sisteminde merhabalar yazısını göreceğiz. Yeni bir sayfa belirtmek isterseniz def ile adını belirtip adrese o adı yazacağınız zaman fonksiyonda belirttiğiniz işlemler yapılacaktır. (Burada index genel tabirdir.)
Evet buraya kadar sorunsuz geldik. Şimdi model dosyamızın hangi tabloyu kullanacağını belirtiyoruz. app/models/icerik.rb dosyasını açıyoruz ve ona "icerikler" tablosunu kullanması gerektiğini söylüyoruz.
set_table_name "icerikler"
şimdi ana sayfa içeriklerden gerekli bilgileri alacak olan kodlarımızı yazalım. öncelikle bunları bir array üzerine alalım ki işlem yapmamız kolaylaşsın. denetleyici listeyi şablon üzerinden alacağı için şablonda tüm listeyi alan bir fonksiyon oluşturalım.
def self.liste
find_all()
end
evet şimdi modele liste diye fonksiyon geldiği zaman artık biz tüm kayıtları alabileceğiz. find_all sonucu bir array şeklinde geri döner. bunu denetleyici üzerinden alalım. sonuç dizi olarak döndüğü için gelen sonucu bir diziye atayalım. (not: şu anki tüm işlemleri ana sayfada yapıyoruz.)
@icerikler = Icerik.liste
burada @icerikler bundan sonra kullanacağımız dizinin adı, Icerik şeklinde belirtilen kısım şablonun (modelin) adı ki ilk harfi büyük ve liste şablonda belirtilen fonksiyonun adı. Şimdi biz içerik listesini @icerikler dizisine aldık. Ama bunu kimse göremiyor şu an. MVC sistemininde M ve C kısımlarını yaptık. Verileri aldık, bunları düzenledik şimdi göstermesi kaldı. Şu anda index üzerinde çalıştığımız için index.rhtml adında bir görüntü dosyası oluşturalım. Şu anda icerik modeli üzerinde olduğumuz için bunu app/views/icerik/index.rhtml şeklinde kaydedelim. Peki index.rhtml. Kayıtları göstermek için bir başka fonksiyon belirtir isek hem bundan sonraki işlerde sorun olmaz hem tasarımı değiştirmek daha kolay olur. Bunun için öncelikle kayitlari_goster fonksiyonu yapalım. bu fonksiyon kendisine gönderilen dizi üzerinde işlem yapacak. Bu fonksiyon denetleyicinin tamamında kullanılacağı için rails tarafından bize yardım amaçlı (:) oluşturulmuş dosya üzerine koyalım ki tüm denetleyici tarafından kullanılsın. app/helpers/icerik_helper.rb dosyasını açalım ve aşağıdaki kodları ekleyelim.
def kayitlari_goster(lste)
yazi = ""
lste.each do |@kayit|
yazi << @kayit.icerik_basligi end return yazi end
yapılan işlem şu şekilde. kayitlari_goster adında bir fonksiyon belirtiyoruz. Buna bir dizi gönderiliyor. ve o dizinin her elemanını ayırarak ve gerekli görünümü yaparak geri gönderiyor. her ayrılan değerden noktadan sonra tablodaki alanı yazarak o alana ait bilgiyi alabiliriz. tüm değerleri ve şekli şemali "yazi" değişkenine atıyoruz ve en son o değeri fonksiyondan çeviriyoruz. Şimdi sıra index.rhtml dosyasını düzenlemeye geldi. Artık burası tasarım bölümü ve biraz da sizin yapımcılığınıza kalmış :) Ben örnek olarak şöyle bir sayfa oluşturdum:
<html>
<head>
<title>Icerik Sistemi</title>
<body>
<h1>Icerik Listesi</h1gt;
<%= kayitlari_goster(@icerikler) %>
</body>
Yeni kayıt ekleme, arama, kategorileme gibi özelliklerin eklenme işlemi vs. tüm diğer işlemler adım adım incelenecek, kodlar oluşturalacak.