İletişim sayfası
Uygulamamıza İletişim sayfası ekleyerek devam edeceğiz. Öncelikle test rutinlerini ekleyelim.
test/controllers/static_pages_controller_test.rb
Tabi ki test yaparsak hata verecektir.
Aynı daha önce about eylemi için yaptıklarımızı tekrarlayacağız. Öncelikle yönlendirmesini yapalım.
config/routes.rb
Şimdi de kontrolöre eylemi ekleyelim.
app/controllers/static_pages_controller.rb
Şimdi bir de görsel sayfası ekleyelim.
app/views/static_pages/contact.html.erb
Artık uygulamamız testten geçiyor durumda. İletişim sayfası eklendi.
Rails yönlendirmeler
İsimlendirilmiş yönlendirmeler için tabi ki uygulamamızın yönlendirmelerinin yapıldığı config/routes.rb dosyası kullanılır.
Bu satır uygulamamızın / ana root adresini static_pages#home eylemine yönlendiriyor. Bu şekil yönlendirmenin bir önemli etkisi daha var. Yönlendirmeleri düz URL değeri yerine isimlendirilmiş yönlendirmelerle yapmak. Uygulamamızda kullanabileceğimiz iki isimlendirilmiş yönlendirme var, root_path ve root_url değişkenleri.
path değişken uygulama root'una göre bağıl, url değişken ise tam url web adresi olur. Normalde redirect hariç path değişkenler kullanacağız.
Şimdi diğer sayfalar için de isimlendirilmiş yönlendirme yapmak için routes.rb dosyamızı değiştirelim.
bunun yerine
yapmalıyız. Bu sayede help_path ve help_url değişkenleri oluşur. Hepsi için uygularsak
config/routes.rb
Yönlendirmeler değiştiği için testlerimiz hata verecektir. Onları da bir düzenleyelim.
static_pages_controller_test.rb
İsimlendirilmiş yönlendirmeleri kullanalım
Yönlendirmeleri düzenleyerek artık görsellerimizdeki linklerde isimlendirilmiş yönlendirmeleri kullanabiliriz. link_to metodlarına verdiğimiz ikinci argümanlardaki "#" değerini artık değiştirebiliriz.
yerine
yazabiliriz.
Kısmi görselimiz _header.html.erb görselinden başlayalım.
app/views/layouts/_header.html.erb
Sadece Giriş Yap linkini sonraya bıraktık, çünkü daha şifreli kullanıcı girişleri konusuna çok var. Ana sayfa için root_path ve yardım sayfası için help_path değişkenlerini kullanıyoruz.
Sırada ikinci kısmi görselimiz _footer.html.erb dosyası var.
app/views/layouts/_footer.html.erb
Burada da Hakkımızda sayfası için about_path ve İletişim sayfası için contact_path değişkenlerini kullanıyoruz. Burada Haberler linkinde de target: "_blank" öznitelik değerini verdik, <a> elemanlarında target="_blank" özelliği bağlantının yeni sekmede açılmasını sağlar. Burada da Haberler bağlantısı bir dış siteye gönderdiği için yeni bir sekmede açılmasını sağladık.
Yerleşimdeki linkleri test etmek
Yerleşim görsel dosyamızdaki linkleri değiştirdik, şimdi bir test kodu yazarak sağlıklı çalıştıklarını görelim. Bunu tarayıcımızda linkleri tek tek tıklayarak deneyebiliriz. Ama burada amacımız üzüm yemek değil, test işlerini öğrenmeye çalışıyoruz.
Bu adımda bir integration_test üreterek başlayacağız. Bunlar uygulamamızın davranışları konusunda uçtan uca testler yazmamıza yardımcı olur. Adını site_layout koyduğumuz bir test şablonunu Rails'e ürettirmek için terminalde şu komutu girelim.
rails g komutunun rails generate komutu ile aynı işi yaptığını söylemiş miydim? Dağlara taşlara bir komut, üretmediği şey yok.
Dikkat ettiyseniz Rails ürettiği test dosyasının adına otomatik olarak _test ilavesi getirdi.
Planımız şu:
- Ana sayfayı çağırmak
- Doğru görsel şablonuın yayınlandığından emin olmak
- Ana Sayfa, Yardım, Hakkımızda ve İletişim linklerinin doğruluğunu görmek
test/integration/site_layout_test.rb
Bu değişikliklerden sonra test çalıştırınca bir hata aldım ama testle alakalı değil
assert_template metodu başka bir gem içine taşınmış ve bunu da Gemfile içine dahil edip bundle install yapmamız gerekiyormuş. Ben Gemfile içine bir değişiklik yapacaksam hemen uygulama klasörümün bir yedeğini alıyorum, size de tavsiye ederim.
Haydi Gemfile içine mesajda geçen gem'i ekleyelim.
Gemfile
ve bundle çalıştıralım
Gem yüklendikten sonra testimizi tekrar çalıştıralım.
Ana Sayfa'da 2 tane root_path olması lazımdı biri logoya tıklayınca diğeri de navbar'ın üzerindeki Ana Sayfa yazısı, ama bir tane bulmuş testimiz. Eksiği _header.html.erb kısmi görselinde buldum.
Logodaki linki unutmuşum,
olması gerekiyordu, düzeltip test çalıştırdım, sonuç başarılı oldu. Bu test kodundaki satırlara bir bakalım.
İsteği yapılan sayfa için "static_pages/home" görsel dosyasının yani home.html.erb dosyasının yayınlanması beklentisini ifade ediyor.
<a> elemanları içinde <a href="/"> özelliğine sahip olan elemanlar bekliyor. count: 2 ile de bu beklentiye uyan 2 tane eleman olması beklendiği belirtiliyor. Bu assert_select metodunun birkaç örnek kullanımını görelim.
Sadece entegrasyon testlerinin çalışması için
Kullanıcı kayıt işlemine giriş
Kullanıcılara bir giriş olsun diye bu bölümde bir kayıt olma sayfası linki ekleyeceğiz. Tamamlanması daha zaman alacak. Yeni bir kontrolörle başlayacağız, ilerleyen bölümlerde User modeli ve kayıt işlemlerini yapacağız.
Users kontrolörü
Bundan önce Static Pages kontrolörümüzü oluşturduk Sıra ikinci kontrolörümüz Users kontrolörüne geldi. Daha önce olduğu gibi generate kullanacağız, ama sadece temel olarak yeni kayıt eylemi olacak şakilde. Rails REST ilkelerine uygun olarak yeni kullanıcı kayıt sayfasını new eylemine bağlayacağız.
Bu komutla Users kontrolörü ve eylemleri dosyası, new eylemi için görsel dosyası ve kontrolör için bir test dosyası oluşturulur.
app/controllers/users_controller.rb
app/views/users/new.html.erb
test/controllers/users_controller_test.rb
Bu noktada test çalıştırırsak sorunsuz geçmelidir.
Signup URL değeri
Yönlendirme dosyamızda
satırı eklenmiş olmalıdır. Bunu "/signup" bağlantısını alacak ve isimlendirilmiş yönlendirme olacak şekilde, diğerleri gibi düzenleyelim.
config/routes.rb
Tabii ki test çakılacak hemen düzenleyelim
test/controllers/users_controller_test.rb
Şimdi Ana Sayfa'daki "Hemen Katılın!" yazılı butonun linkini isimlendirilmiş yönlendirme kullanır şekle getirelim.
app/views/static_pages/home.html.erb
Son olarak Kayıt Ol sayfasına kaba bir görünüm ekleyelim.
app/views/users/new.html.erb
Artık Ana Sayfada Kayıt Olun butonu tıklanınca bu geçici görselimiz açılacaktır.
Bu bölümde öğrendiklerimiz
- Html5 kulanarak header, footer, logo ve gövde içeriği olan sayfalar yapabiliriz.
- Rails kısmi görselleri karmaşık görsel dosya kodlarını güzelleştirmek için çok faydalıdır.
- CSS kuralları yazarak görsellerimizin stillerini değiştirebiliriz.
- Bootstrap kütüphanesi kullanarak kolayca güzel görünümlü web sayfaları yapabiliriz.
- Sass ve asset pipeline sayesinde tasarım esnasında ve üretim modunda ayrı CSS dosyalama teknikleri ile uğraşmadan performanslı uygulama geliştirebiliriz.
- Rails ile kemdi yönlendirmelerimizi yapabilir, isimlendirilmiş yönlendirmeler kullanabiliriz.
- Entegrasyon testleri ile tarayıcıda sayfadan sayfaya geçiş tıklamaları test edilebilir.
Kullanıcıları Düzenlemek
En son yeni kullanıcılar eklemek için bir sayfa temelini oluşturmuştuk. Bundan sonra bu Kayıt Olun sayfası üzerinden öğrenmeye devam edeceğiz. Bu bölümde ilk adımımız data modelimiz olan User modelini tanımlayacağız ve oraya veri atmak için düzeneği kuracağız. Sonraki bölümlerde kullanıcının kayıt olup kullanıcı sayfasını hazırlamasını gerçekleştireceğiz.
Kendi yetkilendirme sisteminizi tasarlamak
Genelde tüm web uygulamalarında bir çeşit yetkilendirme sistemi olur. Sonuç olarak birçok web framework bu işleri görecek kütüphanelere sahiptir, Rails de öyledir. En yaygın kullanılan Devise gem'dir ve güçlü uygulamalar yapmakta kullanılır. Ancak öğrenmek amacımız olduğu için ve bu tip kütüphanelerin veri yapılarını anlamak ustalar için bile zor olduğu için, kendimize göre bir yol izleyeceğiz.
Ancak tüm öğrendikleriniz sonunda hala 3. parti birilerinin geliştirdiği sistemi kullanmaya karar verirseniz en iyi seçim Devise olacaktır.
User modeli
Hedefimiz yeni kullanıcıların kaydı olduğuna göre, kullanıcı bilgilerini saklayacak bir yere ihtiyacımız var. Kayıt sayfasına bir taslak hazırlarken toplayacağımız verileri de bir düşünelim.
Rails'de bir veri kaydı yapısını tarif ederken Model denir (MVC'deki M). Rails kalıcı verileri bir veritabanında saklamak için Active Record kütüphanesini kullanır. Active Record sınıfı verilerin bir bağıl veri tabanında saklanması , sorgulanması, değiştirilmesi, silinmesi vs SQL sorgulamaları yapmak için birçok metodlara sahiptir. Bundan başka Rails migration kodları sayesinde SQL data definition language (DLL) bilmeden saf Ruby kodları ile veri tabanında tanımlamaları kolayca yapabilirsiniz. Bu sayede geliştirme yaparken SQLite veri tabanı üretim modunda PostgreSQL veri tabanı kullanırken ayrı ayrı kodlar yazmanız gerekmez.
Veri tabanı migrasyonları
Daha önce bir denemede örnek bir User sınıfını name ve email özellikleri ile tanımlamıştık.
Rails konsolda bu sınıfı kullanarak ürettiğimiz User nesneleri konsolu kapatınca yok oluyor (çöp oluyor) tabii ki. Bu bölümde amacımız kullanıcılar için bir model oluşturarak verilerin öyle kolayca yok olmasını önlemek.
Daha önce tanımladığımız User sınıfı gibi Rails modelimizi tanımlarken de name ve email öznitelikleri ile başlayacağız, ama bir fark var, kullanıcı adı (name) kayıtlarda sadece bir tane aynısından olacak. Şifre için ilaveyi daha sonra yapacağız.
Rails'de kullanıcıların modellemesini yaparken User sınıfı tanımında kullandığımız gibi attr_accessor metodu ile öznitelikleri belirtmiyoruz, bunun yerine modelimiz veri tabanındaki bir tabloya işaret ederken öznitelikler de o tablonun sütun başlıklarını gösterir. Örneğin isimleri ve email adresleri olan kullanıcıları üretmek için users tablosunu name ve email sütunları ile oluşturacağız. Bu tablodaki her satır bir kullanıcı kaydına karşı gelecektir. Hayalimizde şöyle kayıtları olan bir veri tablosu var.
Bu tablo için düşündüğümüz tablo yapısı ise
Rails modeli olarak bu tabloyu yaparsak elde edeceğimiz tablo ise
Daha önce kontrolör eklemek için
kullandığımız gibi generate model ile de bir model ekleyebiliriz.
Burada dikkat edilmesi gereken nokta kullanıcılar için tasarlanan model için tek bir kaydı ifade eden User teriminin kullanılması (Users değil). Kontrolör adı Users fakat model adı User olmalı. Argümanlarda name:string ve email:string vererek tablomuzda string değer olan name ve email sütunları olmasını istediğimiz ifade ediyoruz.
Terminalde girdiğimiz generate komutunun ürettiği dosyalardan biri de db/migrate/ klasörü içinde ürettiği ..._create_users.rb migrasyon dosyası. Bu dosyayı kullanarak veri tabanında gereken tablo ilavemizi yaparız. Şimdi içine bir bakalım.
db/migrate/[timestamp]_create_users.rb
Migrasyon dosyasının adı üretildiği zamanı ifade eden bir değerle başlıyor. Mesela bendeki adı 20250404135314_create_users.rb . Yıl-ay-gün-saat-dakika-saniye birleşimi bu notasyonu ben tüm projelerimde yedek alırken .zip dosyalarının isimlerine eklerim ki geriye dönmem gerekirse istediğim tarihi bulabileyim. Rails kullanırken edinilen bu mantıklı isimlendirmeyi ekip arkadaşlarıma zorunlu yaptırıyorum.
Migrasyon kodunda tanımlanan change metodu Rails'e veri tabanında bir değişim yapılacağını bildirir. Bu migrasyonda change metodu içinde create_table ile kullanıcılar için users adında yeni bir tablo ekleniyor. create_table metodu bir blok alıyor ve blok değişkeni olarak t değişkeni eklenecek olan users tablosunu işaret ediyor. Metod t değişkenini tabloya name ve email sütunlarını eklemek için kullanılıyor, her ikisi de string tipinde veriler içerecek. Buradaki tablo adı çoğul (users) ve modeldeki isim tekil (user), bu Rails'in bir geleneği, bir model tek bir kullanıcıyı ifade ederken tablomuzda birçok kullanıcının kaydı olacak. Kod bloğundaki son satırda t.timestamps yazıyor. bu özel metod created_at ve updated_at adında başlığı olan iki sütunu tabloya ekler. Bu iki sütunda sırasıyla kaydın eklendiği zaman ve en son değiştirildiği zaman bilgileri otomatik olarak Rails tarafından doldurulacak.
Şimdi bu migrasyonu (yani birleştirmeyi) gerçekleştirip veri tabanımızın kullanıcılar için tablo sahibi olması için terminalde,
Dikkat edin db:migrate, benim hep düştüğüm hata gibi db/migrate değil. Eğer db:migrate komutunu ilk defa çalıştırırsak (ki Yeni App içinde ilk oldu) storage/development.sqlite3 adında bir veri tabanı dosyası oluşturur. Bu bir SQLite veri tabanıdır. Bende DB Browser for SQLite diye bir portatif uygulama var, bununla açınca veri tabanında users tablosu yapılanması
ve tabii ki şu anda içinde bir veri kaydı bulunmuyor.
Burada migrasyon dosyasında bile olmayan id sütunu Rails tarafından eklenir ve tüm tablolarda otomatik olarak eklenerek aynı değerlere sahip ama başka satırlarda girilmiş kayıtların birbirinden otomatik ayrılmasını sağlıyor. Bu sütuna girilen değer her kayıt girildikçe otomatik artar ve geri kalan değerler aynı olsa bile id değerleri hep farklı olur. Girilebilecek sayının üst limitine gelince ne olur? onu şimdilik bilmiyorum.
Model dosyası
322
Hiç yorum yok:
Yorum Gönder