6 Temmuz 2009 Pazartesi

Rails Migration

Bu bölümde oluşturacagımız Ruby sınıfları ActiveRecord::Migration sınıfından kalıtılmaktadır. Oluşturduğumuz sınıflar ‘up’ ve ‘down’ adında iki tane metot içermektedir. Bu metotların kullanımı aşağıdaki gibidir.
ActiveRecord sınıfı aşağıdaki metotları içermektedir.
  • create_table
  • change_table
  • drop_table
  • add_column
  • change_column
  • rename_column
  • remove_column
  • add_index
  • remove_index

Yaratılan her Migration sınıfı ‘db/migration’ dizini altında saklanmaktadır. Oluşturulan sınıfın formatı ‘YYYYMMDDHHMMSS_create_musteri.rb’ (YılAyGünSaatDakikaSaniye formatındadır) gibidir.
Örneğin: Musteri sınıfını ‘20090705103005_create_musteri.rb’ gibi tanımlarız. KurumsalSutunEkleMusteri sınıfını da ‘20090705104030_kurumsal_sutun_ekle_musteri.rb’ olarak tanımlarız. Kütüğün ismini değiştirdiğimizde, sınıfın ismini de güncellemeyi unutmamak gerekir.

create_table ve drop_table
Aşağıdaki yapı ‘musteri’ adında bir tablo oluşturmakta ve oluşturulan tabloya ‘ad’ ve ‘tanim’ sütünlarını eklemektedir. Birincil Anahtar (Primary Key) ‘id’ sütununu da otomatik olarak eklemektedir. Timestamp tipinde ‘created_at’ ve ‘updated_at’ adında iki sütunu da otomatik olarak kendisi yaratmaktadır. Tabloyu drop etmeyi de basitçe örnekte görmekteyiz.

change_table
Tablodaki sütünları istedigimiz gibi güncelleme/ekleme yapabiliriz. Üstelik bunda da bir sınırlama yoktur. Aşağıdaki örneği inceleyelim.

Bu örnekte ‘musteri’ tablosunda;
1) ‘kurumsal’ sütununu ekler ve her yeni müşteri için bu alanı ‘false’ olarak set eder ama gecmişte yaratılmış tüm müşteriler için bu alanı ‘true’ olarak set eder.
2) ‘tanim’ ve ‘ad’ sütünlarını siler,
3) 'hizmet_no’ sütununu yaratır ve bu alanın üzerine index bırakır.
4) ‘guncellenen_kod’ sütununun adını ‘gncl_kod’ olarak değiştirir.

add_column ve remove_column
Boş bir migration sınıfını yaratmak için ruby konsolunda aşağıdaki ilk komut çalıştırılır. Burada migration’dan sonra gelen sınıfın öneki; ‘Add’ ise ‘add_column’, ‘Remove’ ise ‘remove_column’ anlamına gelmektetir. Formatı da: ‘AddXXXToYYY’ veya ‘RemoveXXXFromYYY’ şeklindedir. Aşağıda verilen ruby komutları ve komutların çalıştırılmasından sonra oluşak migration sınıflarının gösterimi vardır.


Rolling Back
Migration üzerinde hata yapıyor olmamız kaçınılmaz bir gerçektir. Hata yapmamız durumunda bir önceki migration’ı rollback etmek için aşağıdaki komut çalıştırılır.

rake db:rollback

bu son migration’ın down metodunu çağırır, eğer birkaç önceki migration’a gitmek istiyorsak;

rake db:rollback STEP=3

son 3 migration’ın down metodunu çalıştırır.

3 Temmuz 2009 Cuma

Rails Validations

Validation, verilerin geçerli bir şekilde istenilen ortamda saklanmasına yardımcı olur. Veriyi saklamadan önce geçerlilik kontrolünü birkaç yolla yapılabiliriz.
  • Database Constraints
  • Client-Side validation
  • Controller-level validation
  • Model-level validation

Database Constraints ve stored procedures, validation kontrolünü veritabanı bağımlı yapmaktadır.Aynı veritabanı birden fazla uygulama tarafından kullanılıyorsa, validation kontrolünü veritabanı üzerinden yapmak daha mantıklı olacaktır.

Client-Side Validation kullanışlı olmakla beraber genellikle tercih edilmez. Eğer JavaScript kullanıyorsanız, Browser’ın Javascript i kapatılmışsa veriler denetimden geçmeden işlenir.
Controller-level’de validation kontrolünün yapılması genelde tercih edilmez çünkü burda iş mantığı ön plandadır ve testinin yapılması zor olur.

Model-level’de validation kontrolünün yapılması en çok tercih edilen katmandır. Nedenlerinden biri son kullanıcı tarafından bypass edilememesidir. Rails framework’unda da validation kontrolünün model’de kullanımını kolaylaştırması ve testinin rahat yapılması tercih nedenleri arasında sayılır.

validates_presence_of
Nesnedeki alanın tanımlı olması ve boş olmamasını kontrol etmektedir.

class Person ‘<’ ActiveRecord::Base

validates_presence_of :soyadi

end

valid? ve invalid?
Nesnenin geçerliliğini kontrol eder. valid? örneği aşağıdaki gibidir, invalid? ise tam tersi durumu ifade eder.

Person.create(:soyadi => “akdeniz”).valid? //Sonuc true
Person.create(:soyadi => nil).valid? // Sonuc false

errors.invalid?
Validation çalıştırıldıktan sonra kullanımı mantıklıdır. Errors’un veri yapısında Collection vardır, nesnenin alanlarını kontrol ettikçe hata varsa ilgili hata mesajını Collection’a atar, yani nesnenin tümünün geçerliliğini kontrol etmek yerine nesnedeki tanımlı alanların geçerliliğini ayrı ayrı kontrol etmemizi sağlar.

person = Person.new
person.errors.invalid?(:soyadi) // Geçerli değilse true döner.

validates_associated
Modeller arasındaki ilişkilerden bahsetmiştik. Bir modeli kaydederken, modelle ilişili diğer modellerdeki alanların geçerliliğinin kontrolünün yapılmasını sağlar, eğer diğer modellerin validation kontrolü geçerli ise kaydetme sürecini başarıyla tamamlar, tersi durumda aykırı durum hatası alır. Kullanımı aşağıdaki gibidir.

class Yazar ‘<’ ActiveRecord::Base

has_many :books

validates_associated : books

end

validates_confirmation_of
Nesne içindeki iki alanın aynı içerikte olması durumunda kullanılır. Örneğin: kullanıcının email adresinin teyit edilmesinde kullanılır. İkinci alanın sonuna “_confirmation” eklenerek yapılır. Default olarak verilen hata mesajı “doesn’t match confirmation”.

class Person ‘<’ ActiveRecord::Base

validates_confirmation_of :email

validates_presence_of : email_confirmation

end

text_field :person, :email
text_field :person, :email_confirmation

validates_exclusion_of ve validates inclusion_of
Nesne içindeki alanın içeriğini kontrol eder, örneğin kullanıcı yaş sınırını kontrol etmek istiyorsak, 18-40 yaş arası kullanıcılar (inclusion_of) ya da 18 altı ve 40 yaş üstü (exclusion_of) (biraz saçma oldu ama J ) kullanıcılar üye olabilir. Kullanım şekli örnekte verilmiştir.

class Person ‘<’ ActiveRecord::Base
validates_exclusion_of: yas, :in => 18..40, :message => “18 altı ve 40 altı yaş ustu”
validates_inclusion_of: yas, :in => 18..40 //18 ile 40 yaşları arası
end

validates_length_of
Nesne içinde istenen alanın uzunluk sınırlamasını kontrol etmek için kullanılır.
validates_length_of :soyadi, maximum => 30, :message => “30 dan az karakter girilmeli.”

Validation Çeşitleri
Uygulamanızın validation kontrolünü yapmanız için model içinde validate metodunu kodlamamız gerekir. Validate metod çeşitleri aşağıdaki gibidir.

  • validate
  • validate_on_create
  • validate_on_update

ActiveRecord çağrılmadan önce validate metodu çağrılır, ikincil olarak kayıt yaratılacaksa ‘validate_on_create’, güncelleme yapılacaksa ‘validate_on_update’ metodları çağrılır. Örnek kullanım aşağıda verilmiştir.

class Person ‘<’ ActiveRecord::Base

def validate

if soyadi.blank?

errors.add_to_base(“Lütfen soyadı bilgisini giriniz”)

end

def validate_on_create

if adi.blank?

errors.add(:adi,“Lütfen ad bilgisini giriniz”)

end

def validate_on_update

end
end

2 Temmuz 2009 Perşembe

Rails ActiveRecord Associations

ActiveRecord’ta ilişkilendirme one-to-one(1:1), one-to-many(1:n), ve many-to-many(n:m) şeklinde modellenir. ActiveRecord’ta modelleme aşağıdaki gibi isimlendirilir.
  • belongs_to (one-to-one ilişki)
  • has_one (one-to-one ilişki)
  • has_one : through (one-to-one ilişki modellerin yaratılma şekli farklı)
  • has_many (one-to-many ilişki)
  • belongs_to (one-to-many ilişki)
  • has_many :through (many-to-many ilişki)
  • has_and_belong_to_many (many-to-many modellemenin alternativ yolu)


‘belongs_to’ ilişki
one-to-one(1:1) veya one-to-many(1:n) ilişkileri modellemek için kullanılır. Foreign Key’e sahip olan modelde kullanılır.
class Ofis '<' ActiveRecord::Base
belongs_to : yonetici
end

‘has_one’ ilişki

one-to-one ilişkileri modellemek için kullanılır. İlişkinin diğer tarafını ifade eder.
class Yonetici '<' ActiveRecord::Base
has_one : ofis
end

‘has_one:through’ ilişki

class Network '<' ActiveRecord::Base
has_one : group
has_one :user, :through => : group
end

class Group '<' ActiveRecord::Base
belongs_to: network
has_one :user
end

class User '<' ActiveRecord::Base
belong_to : group
end

‘has_many’ ilişki
one-to-many ilişkileri modellemek için kullanılır.

class Yazar '<' ActiveRecord::Base
has_many : kitap //Cogul taraf buraya gelir, Bir yazarın birden çok kitabı var.
end

class Kitap '<' ActiveRecord::Base
belong_to : yazar // Bir kitap sadece bir yazara ait olabilir.
end

‘has_many :through’ ilişki
many-to-many ilişkileri modellemek için kullanılır.

class Doktor '<' ActiveRecord::Base
has_many : doktor_hasta
has_many :hasta, :through => : doktor_hasta
end

class Hasta '<' ActiveRecord::Base
has_many : doktor_hasta
has_many :doktor, :through => : doktor_hasta
end

class Doktor_Hasta '<' ActiveRecord::Base
belong_to : doktor
belong_to : hasta
end

‘has_and_belongs_to_many’ ilişki

many-to-many ilişkileri için alternativ modellemek için kullanılır.

class Doktor '<' ActiveRecord::Base
has_and_belongs_to_many : hasta
end

class Hasta '<' ActiveRecord::Base
has_and_belongs_to_many : doktor
end


1 Temmuz 2009 Çarşamba

Ruby Routing

Routing modülü gelen istemleri hangi ‘Controller’ ve ‘Action’a yönlendireceğine karar veren konfigürasyon kütüğüdür yani gelen URL’i konfigürasyon kütüğünde set edilen yapıya göre decode eder. Aşağıdaki konfigürasyon, Rails projesi oluşturulurken otomatik olarak set edilmektedir.
Proje içindeki dizin yapsı /configuration/routes.rb şeklindedir. Örnek vererek açıklamak gerekise http://localhost:3000/stok/guncelle/1 URL’ni controller:stok action:guncelle id:1 olarak pars eder. Genelleme yaparsak default URL’i

olarak gosterebiliriz. Bunu istediğimiz gibi düzenleyebiliriz. map.connect ':action/:controller/:id' gibi düzenleyebiliriz. Yeni URL’imiz http://localhost:3000/guncelle/stok/1 olarak düzenlenir.
Route Tanımlama

Birinci tanımlamada ‘guncelle’ action’nını ‘stok’ controller’ın içinde arar.

İkinci tanımlamada ise action yazılmadığı için default olarak stok ‘controller’ın içinde index action’ı arar. URL’ide http://localhost:3000/stok/index olur.

Yeni Route tanımlarken ‘map.resources’ yapısını kullanırız. 'map.resources :stok' gibi.

Controller’a birden fazla Action’ı ilişkilendirken aşağıda verilen örnekte olduğu gibi tanımlamamızı yapabiliriz.


Controller ve Action’nın View Katmanındaki çağrımı da
link_to ‘Guncelle’, :controller => ‘stok’, action => ‘guncelle’ şeklindedir.

29 Haziran 2009 Pazartesi

Ruby on Rails Kurulum

http://www.ruby-lang.org/en/downloads/ sitesinden windows için kurulum kütüğünü indiriniz, kurulumu tamamladıktan sonra

gem update –system
gem update rails


komutlarını çalıştırınız, Ruby son sürümü indirdiyseniz güncelleme yapmayacaktır. Web uygulaması yapacaksanız Rails framework’unada ihtiyaç duyacaksınız onu da

gem install rails

komutunu çalıştırarak Rails framewok’ununda kurulumunu yapmış olacaksınız. Böylece Ruby kurulumunuz eksiksiz tamamlanmıştır.

gem update rails komutu ile güncellemesini yapabilirsiniz ilerleyen zamanlar için.

Editör tercihi:
Birden fazla editör tercihini yapabilirsiniz

http://www.jedit.org/
http://www.netbeans.org/
http://www.activestate.com/komodo/

Netbeans IDE’si tercihim oldu(Java alışkanlığı J). Diğer editörler hakkında bilgi sahibi değilim, ufak uygulamar için deneyip tercihinizi size en uyumlu editörden yana kullanmak mantıklı olacaktır.


Yeni Web Uygulaması:

IDE kullanmadan Ruby'de web uygulamasını ayağa kaldıralım...




Yarattığımız web uygulaması için WEBRick uygulama sunucusunu çalıştıralım.


http://localhost:3000/
Web uygulamanız ilgili linkte aktif olarak çalışacaktır.

26 Haziran 2009 Cuma

Ruby on Rails

Ruby, nesne yönelimli bir programlama dilidir. Açık kaynak olması, kullanımındaki sadelik ve daha az kod yükü popüleritesinin hızla artmasına yardımcı olmuştur.

Genel olarak programlama dillerini iki kategoriye ayırabiliriz bunlar “Compiled Languages” ve “Scripting Languages”.

Uygulama geliştirirken bilgisayarın anlayabilecegi birşeyler yazmıyoruz, kodumuzun bit ve byte’lara çevrilmesi ve çevrilen kütüklerin makina tarafından çalıştırılması gerekmektedir. Bu sürece “compilation” yani “derleme” denir ve bu süreci gerçekleştiren dillere de “Compiled Languages” denir. Örnek olarakta C, C# ve JAVA programalama dillerini gösterebiliriz.

Ruby, PHP, Python programlama dillerinide “Scripting Languages” çatısı altında toplayabiliriz. Bunların herhangi bir derleyiciye ya da derleme sürecine gereksinimi yoktur, bunun yerine yorumlayıcıya(Interpreter), uygulama sunucusu olabilir, gereksinim duyarlar. Kod direk olarak makina tarafından çalıştırılır.

Ruby programlama dilini kullanarak web uygulaması geliştirmek için;
· Ruby
· Rails Framework
· Veritabanı ‘na ihtiyaç duyulur.
Rails basit tabiriyle framework olarak tanımlanır, web uygulamasını kodlarken büyük bir kod yükünden kurtulmamıza yardımcı olur. MVC örüntüsünün tam olarak uygulandığı bir yapıdır. Proje yaratırken dizin yapısında da net bir şekilde anlaşılmaktadır.




Dizin yapısını biraz açıklamak gerekirse :
Models: ActiveRecord(Model) uygulamanın tüm görevlerini alıp veritabanı ile ilişkilendirir.

class Person ActiveRecord::Base
end


· Veritabanı ile connection sağlar.
· Veritabanından verileri getirir.
· Veritabanına verileri yollar.

Controllers: ActionController(Controller) veritabanı ile sunum katmanı (presentation layer) arasındaki iletişimi sağlar.

class PeopleController ApplicationController
end


· Request’i ele alır.
· Model’den veriyi alır, view katmanına geçmesini sağlar.
· Request üzerinden gelen verileri kullanarak model üzerinde verileri işler.

Views: ActionView(View) Presentation katmanını içerir. Uygulamanın veri modelinin sunumunun yapıldığı sayfalardır yani uygulamanın son kullanıcıya görüntülendiği yerdir.

Configurations: Veritabanı konfigürasyonunun yapıldığı “database.yml” kütüğünü içerir. Her ortam veritabanına bağlanmak için minumum configürasyon bilgisi içerir.