Selam Rails 7 ile denemelerimize devam ediyoruz.
Statik Sayfalar
Bu seferki uygulamamızda biraz daha gelişmiş ve bundan sonraki uygulamalarımıza temel teşkil edecek bir uygulama planlıyoruz. Burada veri tabanına bağlı olmayan statik web sayfaları yapacağız. Statik web sayfalarını Rails yöntemiyle yapmak , bize Rails işleyişini anlamak için çok yararlı olacaktır.
Rails, veri tabanına dayalı web siteleri yapmak için geliştirilse bile , her uygulamanın statik sayfalara ihtiyacı vardır .Rails ile geliştirilen statik sayfalar ise her ne kadar statik dense de kolayca içlerine dinamik davranışlar eklenebilir. Bu uygulama da ayrıca otomatik testler için de bir giriş yapacağız.
yeni_app adında bir Rails uygulaması üretelim
Uygulamamızın iskeletini oluşturalım.
Gemfile içinde rails versiyonunu sabitleyelim.
Şimdi bundler çalıştırıp gemleri yükleyebiliriz.
Uygulamamızın server'ını çalıştırıp default Rails başlangıç sayfasını http://[::1]:3000/ ya da http://localhost:3000/ sayfasında görelim.
Default başlangıç sayfasını gördüysek devam edebiliriz. Önceki uygulamalarımızda da yaptığımız merhaba eylem tanımlamasını burada da yaparak değişikliklerimizin sağlıklı çalıştığını da test edelim.
app/controllers/application_controller.rb
config/routes.rb
Artık http://localhost:3000/ sayfasında Merhaba Dünya! mesajımızı görüyor olmalıyız.
Statik sayfalar
Bu kısımda Rails eylemleri ve kontrolörleri kullanarak statik HTML sayfaları oluşturacağız. Rails eylemleri kontrolörler ( MVC'nin C'si ) içinde tanımlanır. Bu kısımda çoğunlukla app/controllers ve app/views klasörlerinde çalışacağız.
Sayfaları Rails'e ürettirmek
Statik sayfaları scaffold işleminde kullandığımız rails generate komutu yardımı ile oluşturtacağız. Statik sayfalarımızı bir kontrolör içinde toplayacağız, bu amaçla StaticPages adında bir kontrolör planlıyoruz (standart CamelCase Ruby sınıf adı kuralı). Ana sayfamız home , hakkında sayfamız about ve yardım sayfamız help ise kontrolör içinde istediğimiz eylemler. Şimdilik Rails'e sadece home ve help eylemlerini Rails'e ürettireceğiz, about eylemini sonradan kendimiz ekleyerek , onun da nasıl yapılacağını göreceğiz.
Uygulama dizinimizde şu komutu girelim.
Bu arada belirtelim rails generate komutunu kısaca rails g olarak yazabiliriz, diğer kısaltmalar şunlar
Kontrolörümüz ve eylemlerimiz app/controllers/ dizininde üretilmiş olmalıdır. Kontrolör sınıfımız StaticPagesController adında ve odsya ismi ise CamelCase olan sınıf adının snake_case olan versiyonu static_pages_controller.rb.
Yapılanı geri almak
Ola ki bir typo hatası falan yaptık, Rails'in otomatik yaptığı işlemleri nasıl geri alacağız? Ben eski kafalı olarak sürekli uygulama klasörü ve veri tabanı yedeklemeyi tercih ederim. Ancak Rails yapılanları geri almak için yöntem sunuyor.
Neyse uygulamamıza geri dönelim. config/routes.rb dosyasına yeni eylemlerimizin yönlendirmeleri otomatik eklenmiş olmalıdır.
get "static_pages/home" satırı tarayıcıdan /static_pages/home adresine yapılan isteği static_pages_controller kontrolörü home eylemine yönlendirir. Bir ayrıntı daha var, get ifadesi kullanılması HTTP istek tipinin GET olması gerektiğini (yani normal sayfa okuma isteği) de bildiriyor. O zaman sayfalar da mevcuttur. Server'ı çalıştırıp http://localhost:3000/static_pages/home adresine gidersek home eylemine karşı Rails'in hazırladığı görseli görebiliriz.
Mesaja görsel dosyasının yerini de yazmış , app/views/static_pages/home.html.erb dosyası.
Öncelikle kontrolör dosyamıza bir bakalım. Normal Ruby işleyişine bakarsak orada tanımlı home ve help metodları hiçbir şey yapmıyor, ama Rails için bu metodların orada olması o eylemlere karşı gelen görseller de olabileceğini ifade eder. Eğer metod içinde bir görsel yayınlamasına ait kod yoksa Rails bu eylemlere yapılan isteklerde otomatik olarak mesela home eylemi için home.html.erb şablonu ile oluşturulan HTML sayfayı cevap olarak tarayıcıya döner. app/views/static_pages/ dizininde ik görsel için şablon dosyası bulunuyor.
help.html.erb
home.html.erb
Statik sayfalarımızı düzenlemek
Şu anda görsel dosyalarımız standart HTML kodlarında birer sayfa. Bunları isteğimize göre değiştirebiliriz. Örnek olarak şunları yapabiliriz.
home.html.erb
Sayfamızı tarayıcıda açarsak
help.html.erb
Rails testleri
Testler sayesinde Rails uygulamamızda değişiklikler yaptıkça , hala uygulama amaçlarımıza uygun çalışmaya devam ediyor mu? sorusunu otomatik cevaplamak için yapılır. Buradaki gibi 2 sayfası , 3-5 verisi olan bir uygulama için test işlemi bir şey ifade etmeyebilir, her değişiklikten sonra olasılıkları tek tek kendimiz deneyebiliriz. Ancak uygulama büyüdükçe tüm fonksiyonlar hala çalışıyormu denemek için çok fazla vakit harcamak gerekir. ve insan doğası olarak bir şeyleri atlayabiliriz.
Testler temelde kontrolörler ve modellerin işleyişlerini kontrol etmek için yapılır. Başlangıç olarak kontrolörlerin testi daha basit olmaları sebebiyle iyi bir nokta.
İlk test kodumuz
Test Driven Development ( TDD ) adı verilen bir yazılım geliştirme tekniği varmış. Yazılımcı önce test kodunu yazıyor sonra uygulamayı testlerden geçecek hale getiriyor. Bunu bir örnekle görmek için about eylemini kullanacağız. Hatırlarsak StaricPages kontrolörü ve eylemleri rails generate komutu ile üretirken Hakkında sayfası about eylemini kasıtlı olarak sonraya bırakmıştık. Öncelikle şu anda uygulamamızda mevcut kontrolör ve eylemlerin testinin nasıl yapıldığını görelim.
rails generate komutunun kontrolörler için oluşturduğu test rutinleri test/controllers/ dizininde bulunuyor. Statik sayfalarımızın test kodunu açalım
static_pages_controller_test.rb
Rails'in test metodu argümanında test amacını açıklayan bir string ve test için işlenecek bir kod bloğu alıyor. Sayfaya bir GET çağrısı yapılıyor ve assert_response metodu server'ın çağrıya :success (yani status kodu 200) dönmesini bekliyor, eğer olmazsa test hata verir. static_pages_home_url argümanını Rails otomatik olarak /static_pages/home url adresine çevirir.
Şimdi uygulamamızı test edelim
Sonunda diyor ki 2 test çalıştırdım, 2 beklenti vardı, 0 hata, 0 error. Yani test başarılı. Testlerimiz kodlarda belirtilen kriterleri karşıladı.
Reddedilen test
TDD kurallarına göre öncelikle reddedilen testler yazacağız, sonra da kodumuzu testten geçecek şekilde elden geçireceğiz. Bazı sistemlerde testten geçince sonuç yeşil, geçmeyince kırmızı renkli yazılarla ifade edildiği için bu işlem sırasına red-green-refactor adı da veriliyor.
Amacımız "Hakkında" sayfamız about eylemi için reddedilen bir test yazmak. Bunu yapmak için diğer statik sayfa eylemlerimiz için otomatik yazılan kodun bir eşleniğini about eylemi için yazmak.
static_pages_controller_test.rb
Beklendiği üzere Rails test çalıştırınca başarısız olacaktır.
Yazanların bir kısmını kaldırdım, ama bu kadarına bakarsak test_should_get_about test işleminde static_pages_about_url nesnesini bulamadığını belirten bir hata veriyor. Şimdi kodumuzu düzenlemeye başlayalım.
Kabul edilen test
İlk olarak hata mesajındaki yönlendirme url değerini bulamamasından başlayalım. Biliyoruz ki yönlendirmeler config/routes.rb dosyasında. Bu dosya içine about sayfası için ilavemizi yapalım.
Şimdi testi bir daha çalıştıralım.
Bu sefer server'a adres sorulmuş fakat beklenen HTTPresponse kodu olan 200: success yerine server'dan 404: Not Found kodu dönmüş. Aslında server çalıştırıp http://localhost:3000/static_pages/about sayfasını açmaya kalkarsak bize daha net bir bilgi veriyor.
Yani kontrolör istek yapılan eylem hakkında bilgiye sahip değil. Kontrolörümüz app/controllers/static_pages_controller.rb dosyası ve burada about eylemini kontrolörümüze eklememiz gerekiyor.
Hemen testi tekrar çalıştıralım.
Bu sefer de server 406: Not Acceptable durum kodu döndü. Neler olduğunu anlamak için server çalıştırırsak.
Server da diyor ki "görsel şablonun yok". Default olarak görsel şablonu aradığı dosya adını da server mesajında görüyoruz. app/views/static_pages/ dizinindeki diğer görsellerden mesela home.html.erb dosyasının bir kopyasını about.html.erb adıyla oluşturalım ve içini düzenleyelim.
Test çalıştırırsak başarılı olacaktır. Artık uygulamamız about eylemine de sağlıklı cevap veriyor.
Kodu düzenleme
Sıra geldi red-green-refactor sıralamasındaki refactor , yani kodumuzu düzenleme kısmına. Uygulamalar geliştikçe kodlarımız , dosya yapımız vs. karmaşıklaşmaya başlar. Bu durum Ruby yorumlayıcıyı ilgilendirmez, ancak kodu kullanmaya ve geliştirmeye devam edecek olanlar, yani yazılımcılar için önemli bir konu. Sürekli tekrarlanan kodları fonksiyonlara toplamak, aslında olması gereken dosyadan başka bir dosyada olan kodu yerine taşımak, kodun görsel olarak daha anlaşılabilir olmasını sağlamak vs işlemler refactoring işlemleridir ve uygulama geliştirirken düzenli olarak yapılması gerekir.
Uygulama geliştirirken arada nefes almak için durduğumuzda kendimize "şimdi neler yaptım?" sorusunu bir sorup eğer yakınımızda bizi kafayı yemekle suçlayacak biri yoksa yüksek sesle kendimizi cevaplamamız gerekir. Nasıl bir düzenleme yapılabilir, bu değişkenin adını doğru mu verdim, bu kod parçasını şu dosyaya taşısam daha iyi değil mi gibi sorular ile kendimizi motive ettiğimiz gibi , eğer yanlış bile yapsak kendimizi daha geliştirmiş oluruz.
Azıcık dinamik sayfalar
Bazı statik sayfalar için gereken eylemleri ve görselleri uygulamamıza ekledik. Şimdi sayfalarımıza içeriğini anlatan başlık etiketine sahip olması için biraz dinamik içerik ekleyeceğiz. Sayfalarımız her ne kadar statik olsa da Rails onların dosyalarını dinamik içerik eklemeye müsait olarak oluşturdu.
Planımız home, help ve about sayfalarını düzenleyerek her sayfanın başlık etiketini <title> tag'inin içeriğini kontrol ederek dinamik hale getirmek. Birçok tarayıcı title tag içeriğindeki yazıyı sekme etiketinde gösterir. Amacımıza ulaşmak için yine TDD tekniği ile red-green-refactor işlem zincirinde ilerleyeceğiz. Önce sayfalarımızın etiketlerini kontrol eden ve olumsuz dönen bir test yazacağız, sonra her sayfaya etiket ekleyip testin olumlu sonuç vermesini sağlayacağız, en son da tekrarlanan kodları uygulamamız yerleşim dosyası içinde birleştirip kod düzenlemesi (refactor) yapacağız.
Bu işlemler sonucunda sayfa etiketlerimiz <sayfa etiketi> | Yeni App şeklinde olacak. Etiketin ilk parçası sayfa içeriğini anlatıyor.
Rails new komutu ile uygulamamızı oluştururken Rails uygulamamız için default bir layout (yerleşim) dosyası oluşturdu. Bunu app/views/layouts/application.html.erb dosyasında görebiliriz.
Şimdilik bu yerleşimi kullanmamak için dosyanın geçici olarak adını değiştirelim.
isterseniz kod editörünüz açıksa dosya adını orada da değiştirebilirsiniz. Bu isim değiştirme işini gerçek uygulamalarda yapmayız, ama burada amacımız yerleşim dosyasının ne işe yarayacağını da öğrenmek.
Reddedilen test
Sayfa etiketlerini anlamak için bir HTML dosyasının temel yapısına bakalım.
Burada <title> tag içeriğindeki Selamlama yazısı tarayıcıda sekme etiketinde yazılacak değerdir.
Reddedilen testlerimiz için testlerimizde her sayfaya yapılan get çağrılarımızda bir beklenti daha ekleyeceğiz. Bunu assert_select metodu ile yapacağız, bu metod gelen HTML cevap içinde verilen isimdeki tag'i bulur ve verilen değerle içeriğinin eşit olmasını bekler.
Tüm sayfalarımız için bu test ilavesini test/controllers/static_pages_controller_test.rb dosyasına yapalım.
Şimdi test çalıştıralım bakalım.
Mesajlarda server'dan dönen HTML kod içinde "title" adında bir eleman bulunamadığı belirtiliyor. Haydi bu etiketleri görsellere ekleyelim.
Olumlu dönen test
Görsel dosyalarımızı yukarıda verdiğimiz temel HTML sayfa düzeninde olacak şekilde düzenleyelim.
home.html.erb
help.html.erb
about.html.erb
Şimdi testimiz başarılı olur.
Sayfa etiketlerimizi server'ı çalıştırıp tarayıcımızda da görebiliriz.
Yerleşim dosyaları ve gömülü Ruby kodları
Bu uygulamada çok şeyler öğrendik. Ama geldiğimiz noktada can sıkıcı bazı şeyler var.
- Sayfa etiketleri neredeyse aynı (çok az farkları var)
- Tüm etiketlerde " | Yeni App" yazısı ortak
- Her görselde tüm HTML sayfa temel yapısı tekrarlanmış
Sürekli tekrarlanan kodlar Ruby (ve aslında tüm diğer programlama dillerinin) “Don’t Repeat Yourself”(DRY) ilkesine aykırı. Tekrarlamaları düzenleyerek , we’ll "DRY out our code". Düzenlemelerimiz sonrası tekrar test çalıştırarak düzenlemelerimizin uygulama davranışını etkilemediğini kontrol edeceğiz.
Paradoksal olarak tekrarlamaları önlemek için atacağımız ilk adımda biraz daha kod ekleyeceğiz, sonra sadeleştireceğiz.
Görsel dosyalarımızın uzantıları .html.erb yani bu dosyalar embedded ruby kodu içerebilir (gömülü Ruby kodu). Bu kodlama yardımıyla <title> tag içeriğinde değişken olan etiket kısmını bir Ruby değişkenine bağlayabiliriz.
Örneğin home.html.erb dosyasındaki "Ana Sayfa" değerini bir değişkene bağlayalım.
Burada <%= ve %> arasında kalan kısım Rails tarafından bir Ruby kodu olarak değerlendirilir. Bu yapıya birazdan değiniriz, şimdilik içindeki koda bakalım. yield(:title) tam o bulunduğu yere :title nesnesini getirir. Peki :title nesnesi değerini nerede vereceğiz? Onu da dosyanın ilk satırında yapabiliriz.
Kısa bir bilgi , bu sefer gömülü Ruby kodumuzu <% ile başlattık az evvelki <%= ile başlıyordu. Sadece <% ile başlarsa blok içindeki kod çalıştırılır ama çıktısı olmaz, <%= ile başlarsa blok içindeki kod çalıştırılır, oluşan değer o noktaya yazılır. provide metodu ile anlatılmak istenen, bundan sonra :title gördüğün yerde "Ana Sayfa" anlayacaksın. Şimdi sayfamızı yeniler ya da test yaparsak bir şey değişmediğini hala etiketin doğru yazıldığını görürüz. Diğer iki görsele de bu gömülü Ruby kodlarını ekleyelim.
help.html.erb
ve
about.html.erb
Test çalıştırırsak hala etiketlerimizin sorunsuz geldiğini ve testlerden geçtiğini görürüz.
Görsel kodlarına ilave yaptık ama bir düzenleme sonucu olarak artık tüm görsellerimizde ortak olan bir temel HTML yapısı var.
Şimdi geri dönelim ve daha önce layout_file olarak adını değiştirdiğimiz dosyanın adını tekrar application.html.erb olarak değiştirelim ve dosyayı editörümüzde açalım.
Bizim tüm görsellerde ortak dediğimiz HTML iskeleti koduna oldukça benziyor değil mi? (özellikle title tag düşünüldüğünde). Bu kodda sadece <title> tag satırını az önce gördüğümüz şekilde
olarak değiştirip kaydedelim. Kodun geri kalanında bizim görsellerimizde yaptıklarımızdan farklı olan ilave satırları şimdilik dikkate almayın, daha sonra görürüz ne işler yaptıklarını.
application.html.erb dosyasını tüm görseller ortak yerleşim dosyası olarak kullanır. Bu dosya içinde kilit bir kod var.
HTML sayfanın <body> içeriğine denk gelen kısmı <%= yield %> Ruby kodu sayesinde hangi görsel açılıyorsa onda yazılı olanları alır ve tam oraya yazar. Şimdi bu yerleşim tüm görsellerde ortak kullanılacağına göre görsellerimizde kısaltma yapabiliriz.
home.html.erb
help.html.erb
about.html.erb
Testlerimiz hala olumlu sonuç dönüyor ve server'ı çalıştırıp bakarsak sayfalarımız hala düzgün etiketlerle geliyor. Mesela http://localhost:3000/static_pages/home sayfasını tarayıcımızda açalım ve sayfaya sağ tıklayıp "Sayfa kaynağını görüntüle" seçelim. Kaynak şöyle
Bizim home.html.erb içeriği <%= yield %> ile tam buraya yerleştirilmiş. Dosyadaki
satırını burada göremiyoruz, çünkü Rails yorumcusu bu satırı gömülü kod olarak algıladı ve çalıştırdı ama blok <%= ile başlamadığı için sonuç yazılmıyor sadece :title değerine "Ana Sayfa" atanıyor. Bunun etkisini de yerleşim kodundaki
Satırı yerine
<title>Ana Sayfa | Yeni App</title>
Yazılmasında görüyoruz. Sayfa kaynağına tarayıcıda baktığımızda bize gömülü Ruby kodları gelmez, onların çalışması sonucu oluşan HTML sonuçlar gelir, yani Ruby kodları server tarafında çalışır ve sayfayı saf HTML olarak tarayıcıya gönderir.
root yönlendiricisini ayarlamak
Statik sayfalarımızdan "Ana Sayfa" sayfasını yani home eylemini uygulamamızın root sayfası yapmak için config/routes.rb dosyasındaki
satırını
yapalım. Artık tarayıcımızda http://localhost:3000/ sayfasını açarsak "Ana Sayfa" gelecektir.
Bu bölümde neler öğrendik?
- Üçüncü defadır yeni bir Rails uygulaması üretmeyi , gem dosyalarını ayarlamayı ve yüklemeyi , çalıştırıp görmesini sıfırdan yaptık
- Yeni bir kontrolörü rails komutu kullanarak rails generate controller KontrolörAdı <opsiyonel eylem isimleri> ile uygulamaya eklemesini yaptık
- config/routes.rb içine yeni yönlendirmeler ekledik.
- Rails görsel dosyalarının statik HTML ve gömülü Ruby kodları içerdiğini gördük.
- “Red, Green, Refactor” sıralaması ile Test Driven Development yaptık.
- Rails yerleşim dosyaları yardımı ile görsellerde tekrarlanan kodlardan kurtulmasını öğrendik.
Burada bu yazıyı da bitirelim. Sonraki bölümde Rails uygulama geliştirirken kullandığımız Ruby programlama temellerine bir bakış atacağız, zaten Ruby programlamayı biliyorsanız sadece bir bakıp geçebilirsiniz. Şimdilik kalın sağlıcakla..
Hiç yorum yok:
Yorum Gönder