netSınav sistemi tasarısı hakkında daha ayrıntılı bilgiyi buradan bulabilirsiniz.
Bölüm İçin Yol Haritası:
- Yeni Rails uygulamasına baÅ?lama
- Tabloların oluÅ?turulması (ActiveRecord::Migration sınıfı ile)
- Å?ablonların (model) oluÅ?turulması
- Å?ablonlara ait genel-görünümsel yapı kurulması (scaffold)
- netSınav denetleyicisi-yöneticisi ile örnek listeleme
1. bölüme ait kaynak kodları buradan yükleyebilirsiniz (.tar.gz)
Ekran sunumlarını buradan izleyebilirsiniz. (Ekran görüntüleri 800×600 boyut olduÄ?u için buraya konulmamıÅ?tır.)
Detayları ve bölüm yazısını yazının devamında bulabilirsiniz…
Bölüme Dair Genel Açıklama:
1. bölümde sistemi 5 adımda “iÅ? yapar” biçime getireceÄ?iz. İlk bölüm sonunda yeni ders ve sınav oluÅ?turma bölümlerini çalıÅ?ır hale getireceÄ?iz. Dersleri ve sınavları listeleyeceÄ?iz. Fakat henüz bir sınav sistemi olmaya uzak olacak.
Bölüm Açıklamaları:
Yeni Rails Projesine BaÅ?lama
Proje adı “netsinav” olan yeni bir rails projesine baÅ?ladık. (komut satırı: rails)
Veritabanı OluÅ?turulması
Proje geliÅ?tirme aÅ?amasında olduÄ?u için railsin bize sunduÄ?u “enviroment”lardan “development”ı kullanacaÄ?ız. Bunun için buna uygun veritabanı oluÅ?turduk. ( CREATE DATABASE netsinav_development )
Tablo Yapıları & Inflector Ayarlamaları
Sistem dersleri tutan “dersler”, sınavları tutan “sınavlar”, soruları tutan “sorular” ve cevapları tutan “cevaplar” tablolarından oluÅ?acak. Å?ablon (model) isimleri tekil biçimde olacak.
Inflector.inflections hakkında
Rails otomatik olarak ingilizce tekil sözcüklerin çoÄ?unu çoÄ?ul haline çevirebilir. Inflector sınıfına Türkçe tanımasını saÄ?lamak için gerekli kodları yazıyoruz.
- Tablo: dersler
- Tablo: sorular
- Tablo: cevaplar
isim (string): ders adını tutan alan
aciklama (text): derse dair kısa açıklama
ana_id (integer): üst bölümünün numarasını (id) tutar
Tablo: sinavlar
isim (string): sınavın ismi
aciklama (text): sınava dair kısa açıklama
ders_id (integer): baÄ?lı bulunduÄ?u dersin numarası
Ruby On Rails model_id olarak belirtilen alanları eÄ?er ActiveRecord üzerinde de iliÅ?kilendirme yapılmıÅ? ise otomatik olarak birbirine baÄ?lar.
Ã?rneÄ?in ders Å?ablonunda ders.find(4).sinav yazarak 4 numaralı derse ait tüm sınavlara ulaÅ?abiliriz.
yazi (string): soruya ait yazı
sinav_id (integer): gösterileceÄ?in sınavın numarası
yazi (string): cevap için görülecek yazı
dogru (boolean): cevabın doÄ?ru olup olmadıÄ?ının deÄ?eri
soru_id (integer): baÄ?lı bulunduÄ?u sorunun numarası
Bu tabloları oluÅ?turmak için ActriveRecord::Migration sınıfı kullanıldı. Bizim adımıza rails bunları SQL’e çevirecektir.
Tabloların OluÅ?turulması (rake db:migrate)
Rake Ruby için “make” benzeri sistemdir. Genel kurulumsal görevleri bizim adımıza üstlenir, gerekli oluÅ?turmaları yapar.
db:migrate ile bizim yerimize tabloları oluÅ?turdu. (ActiveRecord::Migration destekli. Bunları schema.rb dosyasına geçti.)
Tablo İliÅ?kilendirmeleri
Her ders üzerinden bir ya da birden fazla sınav olabilir. Bu nedenle railse bunu belirttik.
has_many :sinav
Burada has_many bir rails fonksiyonudur. :sinav ise Sınavların model adıdır. Artık ders.find_by_isim(’Matematik’).sinav yazarak Matematik dersine ait tüm sınavlara ulaÅ?abiliriz.
acts_as_tree
Railsin kategorisel listeler oluÅ?turmak için bize sunduÄ?u bir fonksiyon. Daha detaylı bilgiyi burada yazmıÅ?tım.
belongs_to
Sınavın derse, soruların sınava, cevapların sorulara baÄ?ımlı olduÄ?unu belirtmek için “belongs_to” fonksiyonun kullandık.
Ã?rneÄ?in; sinav.find_by_isim(’Zihinden Problemler’).ders.isim yazarak Matematik deÄ?erini bulabiliriz.
scaffold ders yonetim/dersler …
Bir yapı kurarak railsin bizim adımıza kayıt ve listeleme iÅ?lemlerini yapacaÄ?ımız denetleyici (controller) oluÅ?turmasını istedik. scaffold model controller yazarak yeni bir yapı oluÅ?turabiliyoruz.
ders, sınav, soru ve cevap ayarları “yönetim”in olacaÄ?ı için (bir kaç bölüm sonra inÅ?allah) bunları yönetim klasörüne oluÅ?turmasını söyledik.
Scaffold henüz iliÅ?kilendirilmiÅ? yapıları tanıyamadıÄ?ı için (örneÄ?in “belongs_to :ders”) buna uygun alanları elle oluÅ?turduk.
sinav/_form.rhtml - partial bir Å?ablondur. render_partial :form diyerek herhangi bir yere koyabiliriz - dosyası kayıt ekleme ve düzenleme için gerekli ekranı tutar. onu güncelledik.
collection_select(model, alan, liste, seçenek deÄ?eri, görülecek deÄ?er, ayarlar)
varolan listeyi htmlnin “select” etiketine çevirir, alanları “option” olarak yazar ve dönecek deÄ?erin modelin alan kısmına ait olduÄ?una belirtir (kayıt için o alanı kullanır)
netsinav controller
Bizim asıl iÅ?lemlerimizi yönlendirecek olacak denetleyici. Ã?rnekte açılıÅ?ta bizim adımıza dersleri ve derslere ait sınavları listeledi.
index fonksiyonu denetleyicinin ana sayfasıdır. Burada @dersler = Ders.find_all diyerek tüm dersleri @dersler deÄ?iÅ?kenine atadık.
Daha sonra view klasöründe buna uygun bir görünüm oluÅ?turduk. (view’de fonksiyon.rhtml - fonksiyonumuz “index” olduÄ?u için index.rhtml)
Rhtml dosyaları eRB Å?ablon sistemini kullanan html’nin içerisine ruby komutları gömebileceÄ?imiz Å?ablon sistemidir.
<% ile%> arasına gömeceÄ?iz komutlar sayfaya yansımaz.
<%= ile %> arasına gömeceÄ?iz komutlar sayfaya yansır.
@dersler.each diyerek tüm dersleri bir döngü içerisine aldık.
derse ait sınavları “sinavlar” deÄ?iÅ?kenine atadık.
eÄ?er derse ait sınav varsa liste etiketi koyduk (ul) ve sınavların tamamı için yeniden döngüye geçtik ve ekrana yazdırık (<li>..</li>)
Bölüme Ait Fonksiyonların Açıklanması:
collection_select(model, alan, liste, seçenek deÄ?eri, görülecek deÄ?er, ayarlar)
varolan listeyi htmlnin “select” etiketine çevirir, alanları “option” olarak yazar ve dönecek deÄ?erin modelin alan kısmına ait olduÄ?una belirtir (kayıt için o alanı kullanır)
@dersler.each, sinavlar.each
Ruby’nin bir fonksiyonu olup, “for” döngüsünün “block” biçimine çevrilmiÅ? halidir. Dizinin tüm elemanları üzerinde iÅ?lem yapar ve mevcut elemanı bir deÄ?iÅ?kene atayabilirsiniz. @dersler.each do |ders| için derslerin; derslerin tamamında “ders” olarak elemanları al Å?eklinde kullanıldı.
Bölüme Ait Detaylar, Açıklamalar
Yeni bir “Ruby On Rails” projesi oluÅ?turmasını, tablo oluÅ?turmayı ve tabloları iliÅ?kilendirmeleri, genel yapı ile basitçe olarak verilere dair iÅ?lemleri gördük.
Migration:
Migration ile ruby kodu üzerinden tablo oluÅ?turma, yeni alanları ekleme ve kaldırma iÅ?lerini otomatik olarak yapabiliriz. Model oluÅ?turmadan bir Migration oluÅ?turarak tüm ayarları tek bir dosya üzerinden yapıp, model oluÅ?turmadan hemen scaffold oluÅ?turabilirdik. Fakat her zaman scaffold kullanmayacaÄ?ımız için yalnız model üzerinden bu iÅ?lemleri yapmak bu proje için daha uygun olacaktır.
Model (Å?ablon):
Model sistemi ActiveRecord nesnesine dahil olup, bir orm’dir. Tabloyu bizim için nesnelliÄ?e dönüÅ?türür, iliÅ?kilendirmeleri bizim adımıza yapar, ve bu bölümde görmediÄ?imiz giriÅ? kontrolleri, genel kontroller ve diÄ?er veritabansal iÅ?lemleri yapar.
Controller (Denetleyici-Yönlendirici):
Kullanıcı tarafından gelen istekler doÄ?rultusunda iÅ?lemleri yapmamıza olanak saÄ?lar. Her fonksiyon aslen bir alt sayfadır. İleri bölümlerde (veritabansal iÅ?lemlerin aza indirgendiÄ?i bölümlerde) daha detaylı incelenecektir.
Biterken
İlk bölümde genel iÅ?levler için gerekli olan kısımları tamamladık. Ders ve sınav eklenebilir Å?ekle getirdik.
Sonraki bölümde sınavların oluÅ?turulması ve cevapların eklenmesi ve basitçe nasıl sınav yapılacaÄ?ını göreceÄ?iz inÅ?allah. Aynı dosya üzerinden sürüme devam edilecektir.
1. bölüme ait kaynak kodları buradan yükleyebilirsiniz (.tar.gz)
Ekran sunumlarını buradan izleyebilirsiniz. (Ekran görüntüleri 800×600 boyut olduÄ?u için buraya konulmamıÅ?tır.)







Murat, eline saÄ?lık!
[…] Yılın yazılımlama dili seçilen Ruby’nin gücünü arkasına alan Ruby On Rails uygulama geliÅ?tirme altyapısı gittikçe geliÅ?iyor (yakında 1.2 numaralı sürümüne ulaÅ?acak), dünyada tanınmaya baÅ?lıyor.Yeterince yerli kaynak ve döküman bulunamayan bu “gizemli” altyapıya dair nasıl adım adım bir uygulama geliÅ?tirileceÄ?i “ekran sunumları” (screencast) ile beraber Türkçe anlatılmaya baÅ?lanmıÅ?. Sistem her bölüme dair bir sunum ve açıklama biçiminde ilerliyor. Sisteme dair açıklama burada ve ilk bölüm ise Å?urada yer alıyor. […]
kardeÅ?im, süper olmuÅ? eline saÄ?lık …
RoR hakkında yazılı Türkçe kaynak bile çok azken hazırlanmıÅ? olduÄ?un bu video oldukça kıymetli. TeÅ?ekkür ederim.
2006 yılının en iyi dili seçilmesine raÄ?men ülkemizde yavaÅ? yavaÅ? tanınan RoR için hazırlamıÅ? olduÄ?unuz bu mükemmle sistemetik ve bilimsel çalıÅ?ma için çok teÅ?ekkür ederim.
Ã?alıÅ?malarınızda baÅ?arılar dilerim…
Video çok iyiydi anlatımda. TeÅ?ekkürler Murat ama bana Türkçe kitap lazım. :(
Seri ilerleyecek inÅ?allah. 2. Bölüm hazır gibi. Haftada 1-2 bölüm oluÅ?turma çabasındayım. Ekran görüntülü olduÄ?u için uzun sürüyor, oldukça zaman istiyor.
Onun dıÅ?ında netSınav harici yeni makalelerde yayımlıyorum. Birkaç bölüm sonra bunların tamamının aslında birbirleriyle entegre bir biçimde ilerlemiÅ? olduÄ?u görülecektir.
Bazı konular için ise özel dökümanlar ve makaleler hazırlıyorum. Biraz zaman sıkıntısı, biraz uykusuzlukla boÄ?uÅ?tuÄ?um Å?u zamanların sonunda yeni ve güzel Å?eyler ortaya çıkacak inÅ?allah.
Merhaba, netSinav deyince ben de kendi çalıÅ?mamdan bahsedeyim size.
www.tuzlaatl.k12.tr/sinav
PHP+MySQL ile yaptım.
Açık kaynak kod.
İngilizce ve Türkçe destekli.
5 seçeneÄ?e kadar sınav soruları.
BoÅ?luk doldurma.
GeliÅ?miÅ? soru düzenleyicisi.
İstatistikler.
Kullanıcı ve Yetkililer.
Soru ve cevapları karma.
Forum ve sohbet desteÄ?i…
2 yıl sürdü. Okulda kullanım oranı düÅ?ük. Ã?ünkü öÄ?retmenler soru eklemiyor. Ã?Ä?renci de tabii sıkılıyor aynı soruları görmekten.
şeklinde yazdığımda
Showing app/views/dershane/index.rhtml where line #6 raised:
uninitialized constant Dersgrup::Der
hatası alıyorum, sebebi nedir?
Bunun sebebi “plural” “singular” olayında.
Ders’i otomatik olarak singulara çeviriyor ve sonundaki “s” takısını siliyor.
Bunun önüne geçmek için “turkce.rb (http://turkcerb.rubyforge.org/)” eklentisini kurabilirsiniz.