19 Eylül 2011 Pazartesi

Ruby On Rails Bölüm 1



ROR a başlayan biri olarak sanırım karşılaştığım şeyleri yazsam hem bana hemde başkalarına oldukça faydası olacak.
Yeni bir dil öğrenmenin adımlarını hızlıca ve gereksiz detaylara girmeden anlatmaya çalışacağım. Yazıda ayrıca yaptığım hataları sizinde yapmanız sağlanıyor böylece çözümüde aramaya yardım ediyorum çünkü ben o hatayı yaptım başkasıda yapabilir veya bana denk gelen bir taş olabilir(belki bana göre taştır)

Kullandığım işletim sistemi Mac OS Lion

Ruby : 1.9.2p290
Rails : 3.1.0
gem : 1.8.10
IDE : Netbeans


https://github.com/joshfng/railsready

Burda kurulum işlemlerini yaptıktan sonra logout yapıp yeni console ile rvm enter dediğinizde komutu bulamıyorsa PATH lerin eklendiği dosyaya elle müdahale etmeniz gerekiyor demektir.

~/.bash_profile de eklenen satırları ~/.zshrc içine atmam gerekti.


Sonrası burada : https://rvm.beginrescueend.com/rubies/default/
Böylece ruby versyon olayını istediğiniz gibi değiştirebileceksiniz.

Burda ana hedef Rails framework u kullanılarak bir içerik yönetim sistemi yazma.


[volkan@volkans-MacBook]~/Development/rubyonrails% rails new cms -d mysql


Şimdi bir sürü gereksinim kurup ayarlama yapılacak eğer bir hata meydana gelirse projeyi silip yeniden bu adıma dönün sorun büyük ihtimalle çözülebilir.

Veritabanı mysql olan bir cms projesi oluşturduk.
İpucu: Veritabanı ayarları için cms/config/database.yml

Şimdi projeyi aktif edelim. Bunun için proje içine girip şu komutu yazıyoruz.


[volkan@volkans-MacBook]~/Development/rubyonrails/cms% rails server


Browser dan http://localhost:3000/ dediğimizde işlem tamam.
Şimdi projemizi geliştirelim.

Database oluşturalım


~/Development/rubyonrails/cms% rake db:create


Öncelikle veritabanı yapısını oluşturalım. Tablo ve Field isimlendirmede şuralara göz atabilirsiniz.
http://itsignals.cascadia.com.au/?p=7

Alanlara vereceğiniz tipler için ise şurası iyi bir kaynak: http://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/


rails generate scaffold Content site_id:integer parent_id:integer category_id:integer title:string description:text

rails g scaffold Site parent_id:integer name:string title:string url:string status:boolean

rails g scaffold ContentTranslate translate_id:integer content_id:integer field:string content:text status:boolean

rails g scaffold Translate code:string


Şimdi bu tabloları db ye aktaralım. Eğer DB yoksa aşağıdaki komut eksik olur, öncesinde rake db:create çalıştırmak gerek.


rake db:migrate


Sonradan güncelleme yapmak istersek direk dosyalardan bunu yapıp tekrar migrate komutunu çalıştırmalıyız.
cms/db/migrate/20110920185806_create_contents.rb
Ama bu işe yaramayacaktır :) Nedeni aşağıda yazıyor.

db oluşturduktan sonra kurulacak ilişkileri anlamak için
http://guides.rubyonrails.org/association_basics.html
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Oluşturulan tabloda güncelleme yapmak için.


rails g migration FixColumnName


gibi bir isimle işlem dosyası oluşturuyoruz.


class FixColumnName < ActiveRecord::Migration def up change_table :volkans do |t| t.rename :content_id, :cmd_id end end def down end end
rake db:migrate


ile değişikliklerin db ye gitmesini sağlıyoruz. Yeni kolon eklemek ve daha fazla örnek için: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
http://stackoverflow.com/questions/1992019/how-to-rename-a-database-column-in-rails-using-migration

İpucu: Db de işlem yapmak için oluşturduğunuz dosya bir kere eşitleme yaptıktan sonra aynı komutla bir daha çalışmıyor.
Çünkü schema_migrations tablosunda işlemleri tutup dosyaların kullanılıp kullanılmadığını tutuyor. Böylece size eski sürümlere dönme imkanı tanyor. Yenilik için yeniden dosya oluşturmak gerek. içine up ve down isimli iki tanımlama yapıp istersek sadece up veya downu çalıştırabiliriz. Zaten varsayılan olarak up çalışıyor.

Örnek :

rake db:migrate:down VERSION=20110921190908


İlla son değişikliği yaptım dosya çalışsın istiyorsanız tablosundan 20110920205424 şu biçimdeli ilgili dosyanın bilgisini silin ve tekrar
rake db:migrate yazın. Bu kezde daha önceden yapılan değişiklikler için hata verecektir...


O nedenle en güzeli değişiklikler için yeni dosya oluşturmak.

Bu işlemlerden sonra oluşturduğumuz tablolara hızlıca data girmek için web sayfamızdan tablo adı ile giriş yapabiliyoruz.

http://localhost:3000/contents dediğimizde çalışacaktır.

http://localhost:3000/content_translate yazıp "new Content" oluşturmak istediğimizde hata veriyor.

"field_changed? is defined by ActiveRecord"

Şu hatanın sebebini bulmam biraz uzun sürdü ama sonunda buldum :) ROR tarafından reserve edilmiş isimlerden biri olan "field"
adını kullandığımız için bu hata geliyormuş. Bu konuya dikkat etmek gerektiğini hatırlatmakta fayda var. Ben field yerine field_name kullandım. Ama bu hatayı almanız için yukardaki kodu güncellemedim :)

Not: http://oldwiki.rubyonrails.org/rails/pages/ReservedWords

Projede değişiklik olduğu zaman silip yeniden oluşturmak düzenlemekten daha kolay hem başlarda olduğumuz için hemde
komutlar notlarım arasında (yukarda olduğundan yazmak kolay oluyor.)

Yeri gelmişken ROR da Kod tekrar etmeme muhabbetine girmekte fayda var. Amaç kısa kod yazarak çok iş yapmak bunun bir örneğini veritabanı dosyamızdaki ayarlarda yapalım.

config/database.yml dosyasında normalde geliştirme ortamları tanımlanıp tek tek bütün bilgiler giriliyor ama aşağıdaki gibi yaparsak ana tanımlamayı yapıp sadece değişen kısmı yeniden tanımlayarak bir nevi üzerine yazarak işimizi hızlandırabiliriz.


common: &shared
adapter: mysql2
encoding: utf8
reconnect: false
pool: 5
socket: /Applications/MAMP/tmp/mysql/mysql.sock
username: root
password: root

development:
database: cms_development
<<: *shared

test:
database: cms_test
<<: *shared

production:
database: cms_production
<<: *shared


1. Bölüm bu kadar. İnşallah devamı gelicek...


Kullanabileceğiniz kaynaklar:
http://www.quora.com/Ruby-on-Rails/
http://railscasts.com/
http://www.buildingwebapps.com/

Not: Az kalsın Onur Özgür ÖZKAN'a teşekkür etmeyi unutuyordum neyseki uyumadan önce hatırladım ve bu notu ekledim.

Hiç yorum yok: