Selam Rails 7 ile uygulama geliştirmeye kaldığımız yerden devam ediyoruz.
Kayıt olma işlemleri
Şu anda çalışan bir User modelimiz mevcut, sırada kullanıcıların kayıt olması için sayfalar hazırlamak var.
Kullanıcıların uygulamamıza kayıt olması için bir HTML form kullanacağız. Bu sayede yeni kullanıcı ekleyip veri tabanına kaydını yapacağız. Kayıt işlemi sonunda, kullanıcının girdiği bilgileri görebileceği bir profil sayfasına yönlenmesini sağlamalıyız. Daha önce de yaptığımız REST yapısına uygun olarak ilk önce kullanıcıların gösterildiği bir sayfa ile başlayacağız.
Kullanıcıları göstermek
İlk hedefimiz kullanıcının resmi ve ismini içeren bir profil sayfası. Nihai hedefimizde ise kullanıcının resmi, bilgileri ve mikro gönderilerinin olacağı bir sayfa hazırlamak olacak.
Debug ve Rails ortamları (environments)
Bu kısımdaki profiller uygulamamızın ilk dinamik sayfaları olacak. Görsel dosyamız tek bir sayfa olmasına rağmen içinde gösterilecekler veri tabanından alınan değerlere göre değişecek. Bu noktada uygulama görsel şablonumuza bir şeyler eklesek de , uygulamada kullanılan bazı değerleri sayfada görerek kontrol etsek. Bu amaçla debug metodu ve params değişkeni çok işimizi görecektir. Yerleşim dosyamıza şu eklemeyi yapalım.
app/views/layouts/application.html.erb
Uygulamamızı yayınladıktan sonra bu bilgilerin gösterilmesini istemediğimiz için
İfadesi kullanıyoruz. Eğer Rails geliştirme ortamında değilse o satırdaki bilgiler sayfaya yayınlanmaz, yani karşı tarayıcıya verilen cevap içinde yer almaz.
Rails ortamları
Rails test, development, ve production ortamlarına sahiptir. Rails consolunda default ortam development'dır.
Gördüğümüz üzere Rails nesnesinin env özelliği her ortam için boolean cevap dönen bir metoda sahip. Konsolu test ortamında da başlatabiliriz.
Konsol gibi server da default olarak development ortamı olarak çalışır ama istersek onu da değiştirebiliriz.
Server çalıştırıp ana sayfayı açarsak görsel olarak en altta Debug metodunun yazdıkları gelecektir.
Görünüm biraz daha güzel olsun diye stil dosyamıza ilave yapabiliriz.
app/assets/stylesheets/custom.scss
Şu anda Debug satırlarında yayınlanmakta olan sayfa ile ilgili bilgiler var.
Users Resource
Bir kullanıcının profil sayfasını yapmak için veri tabanında kayıtlı bir kullanıcı olması lazım, kayıt etmek için de kayıt sayfası lazım, yumurta mı tavuktan , tavuk mu yumurtadan gibi oldu. Neyse ki önceki bölümde manual olarak veri tabanına bir kullanıcı eklemiştik. Rails konsolda bu kullanıcıyı görelim.
Yukarıda konsol çıktısından görüldüğü üzere yegane kullanıcımızın id değeri 1.
Daha önce de Users Resource dosyalarının tanımlanmalarını incelemiştik. REST yapısını takip ettiğimize göre /users/1 adresinde bu kullanıcı bilgileri görünecek. Default olarak Rails bunu kontrolörün show eylemine bağlar, daha önce görmüştük. Şimdi server çalıştırıp /users/1 sayfasına gitsek sayfa hazır olmadığı için hata alırız.
Benim yapılandırmamda /users/1 şeklinde bir yönlendirme tanımı yok diyor. REST yapısına uygun adres yönlendirmelerini bir kerede eklemek için routes.rb dosyamıza tek satır ilave etmemiz yeterli.
config/routes.rb
Bu satırla yönlendirmelere eklenen adreslere bir daha bakalım.
Şimdi sayfayı yenilersek show görselini bulamadığını belirtir bir mesaj alırız.
Uygulama görsel sayfalarımıza show.html.erb dosyasını elle kendimiz ekleyeceğiz. Şimdilik içinde şunlar olsun.
app/views/users/show.html.erb
Bu görsel dosyası @user içinde verilen kullanıcının name ve email özelliklerini basit bir şekilde sayfaya yazıyor. @user değeri nereden gelecek? tabii ki kontrolörden. Kontrolörümüzde show metodu içinde @user değişken değerini şöyle veririz.
app/controllers/users_controller.rb
Burada istenen kullanıcı id değerini adresten almak için params nesnesini kullanıyoruz. /users/1 adresine çağrı yapıldığı için params nesnesinin id özelliği değeri 1 olacaktır ve User.find(1) işlemi yapılarak veri tabanına elle kaydettiğimiz kullanıcı kaydı gelecektir (Teknik olarak params[:id] değeri string olarak "1" dir ama find metodu bunu tamsayıya çevirecek kadar akıllıdır).
Şimdi sayfayı yenilersek görselimiz gelecektir.
Alta eklediğimiz debug satırında params nesnesi içinde neler olduğu görülüyor. Rails girilen adresten ve yapılan çağrı cinsinden yukarıdaki tabloda gördüğümüz REST temellerine göre bu değerleri oluşturur.
Debugger
Daha önce yerleşim görsel kalıbında params nesnesini göstermek için debug metodu kullandık. Ama daha direk olarak debug işlemleri yapmak için program çalışmasını durdurabiliriz de. Kontrolörde bir satır ekleyelim.
app/controllers/users_controller.rb
Şimdi sayfayı yenilersek Rails server çalışan terminalde bir debugger prompt'u açılacaktır.
Burada (rdbg) ile bir prompt gösteriliyor , bunu Rails konsol gibi kullanabiliriz.
Göreceğinizi gördükten sonra Ctrl+D basarak çıkarsınız ve kontrolörde debugger satırını silerek server'ı tekrar çalıştırır ve normal çalışmaya dönersiniz.
Bir Gravatar resmi ve yan bar
Görselimizi düzenlemeye devam edeceğiz, ilk hedefimiz sayfaya email adresine karşı gelen bir Gravatar profil resmi koymak. İlk önce sayfa görselimizi değiştirelim.
app/views/users/show.html.erb
Buradaki gravatar_for metodunu biz tanımlayacağız, bu metod Gravatar sitesinden kullanıcının email'ine ait resmi getirecek ve oraya koyacak. Default olarak helper dosyası içinde tanımlanan metodlara tüm görsellerde ulaşılabilir. Biz de Users kontrolör helper dosyasına bu metodu ekleyeceğiz ama önce bir konsol Rails açalım denemeler yapalım.
Bunu neden yaptık? Gravatar sitesi kendilerine yapılan isteklerde email adreslerinin açıkça yazılmasını güvenlik sebebiyle kabul etmiyor, bunun yerine hash koda dönüştürülmüş halini istiyor, ve Rails de bunu Digest modülünün hexdigest metodu ile yapar. Şimdi helper metodumuzu ekleyebiliriz.
app/helpers/users_helper.rb
Sayfamızı yenilersek tabi uyduruk bir email adresi girdiğimiz için default Gravatar resmi gelir.
Ama benim ujk7107 gmail adresimi kullanırsam Gravatarım gelir.
Burada mevcut kullanıcının email adresini değiştirmek için Rails konsolda değiştirip save etmeye kalkarsak hata verir.
Neden bunu yapıyor, çünkü geçerli olması için password ve password_confirmation sahte öznitelikleri olması gerekiyor ve onlar veri tabanındaki kayıtta yoklar. Maalesef kaydedebilmek için onları tekrar girmeliyiz.
Bundan sonra user.save metodu çağırarak kaydedebiliriz. Bu da aklımızın bir yerinde dursun.
Şimdi Bootstrap css sınıfları ve bir <aside> elemanı kullanarak bu bilgileri sol kenarda bir side barda yayınlayalım.
app/views/users/show.html.erb
Bu değişiklikten sonra bilgilerimiz sayfa içerik genişliğinin sol tarafında 1/3 lik bir barda yayınlanacaktır.
Şimdi stil dosyamıza bu soldaki side bar için ilaveler yapalım.
app/assets/stylesheets/custom.scss
Bu stil kurallarının hepsi şimdi için değil ileride eklenecekler için de bir şeyler var. Ama şu andaki görselde etkisi şöyle oluyor.
Kayıt olma formu
Şimdilik idare eder bir profil sayfası oluşturduk. Sitemize yeni kullanıcının kaydolması için gereken kayıt formu sayfasına geçebiliriz. Şu anda önceden geçici olarak hazırladığımız kayıt olun sayfası http://localhost:3000/signup bir işe yaramaz halde.
Bu sayfada bir form içerip kullanıcının kayıt için bilgiler girmesini sağlayacağız.
form_with kullanmak
Kayıt olma sayfasının kalbi isim, email, şifre ve şifre doğrulama değerlerini kullanıcının gireceği bir form. Bunu Rails form_with yardımcı metodu kullanarak yapacağız. Bu metod bir Active Record nesnesini kullanarak özelliklerinden bir form oluşturmak için kullanılır.
Öncelikle kontrolörümüzde new eyleminde boş bir kullanıcı oluşturalım.
app/controllers/users_controller.rb
Şimdi de görselimize bir form ekleyelim.
app/views/users/new.html.erb
Görseli düzgün görünen bir hale getirmek için biraz stil ekleyelim.
app/assets/stylesheets/custom.scss
Bu stil ilavelerinden sonra formumuz şöyle görünecektir.
Burada form label değerleri için Türkçeleştirme yapmak istersek "Doğrulama" label'inde olduğu gibi görsel kodu içinde ilave olarak Türkçesini belirtebiliriz.
gibi. Yok ben bir sürü form kullanacağım her birinde bunu yapmayım da bir yerde label Türkçeleştirmeleri yapayım dersek iş biraz uzuyor. Öncelikle, şu anda tek bir uluslararası dil dosyası var o da config/locales/en.yml dosyası. Bizim burada tr.yml adında yeni bir dosya oluşturup orada bu etiket yazılarının Türkçelerini yazmamız gerekiyor.
config/locales/tr.yml
user modeli özniteliklerinden name için "İsim" ve password için "Şifre" kelimelerinin kullanılacağı belirtiliyor. Bir şey daha yapmamız gerekiyor, uygulamamıza kullanacağımız dilleri ve default dili belirtmek için config/initializers/locale.rb adında bir dosya eklemeliyiz.
config/initializers/locale.rb
Bu locale.rb dosyasını ekledikten sonra server'ı yeniden başlatmak gerekiyor. Ben bu ikinci yöntemi tercih ettim, çünkü kaşınıyorum (Rails standart kodlarına sadık kalmaya çalışıyorum) Rabbim sonumu hayır etsin.
En son değişiklik sonrası sayfa şöyle görünüyor.
Kayıt formu incelemesi
Form kodunu anlamak için küçük parçalara ayıralım. Temel olarak form_with metodu kullanılıyor.
Metoda model olarak @user kullanıcı nesnesi veriliyor, yani formda gösterilecek olan veriler bu kullanıcı nesnesinin özniteliklerine bağlanacak. Arkasından bir kod bloğu geliyor, bloğa f değeri (yani form) gönderiliyor. Genel olarak Rails yardımcı metodlarını nasıl yapmışlar, bilmemize gerek yok, biz Rails'i kullanıyoruz, geliştirmiyoruz. Ancak burada bu f değerinin nasıl kullanıldığını anlamamız gerekiyor.
Bu satırlar @user nesnesinin name özniteliğine bağlanmış form elemanları oluşturuyor. Örneğin bu kod
HTML elemanlarını oluşturur. Sayfa kaynağına tarayıcımızda bakarsak form_with bloğunda üretilen elemanları görürüz.
Burada dikkat çeken değer girişlerinin yapıldığı <input> elemanları. Type özelliklerinde text, email ya da password değerleri var. text ile normal yazı giriliyor, email de öyle ama bazı dokunmatik cihazlar bu kutulara değer girerken email yazmaya yönelik özel bir klavye çıkarır ekrana. password tipi kutular ise içindeki yazılanlar görünmeyen kutulardır (uzaktan bakan biri göremesin diye).
name özelliğinde girilen değer ise form gönderildiğinde params değişkeni içinde bu kutulardaki bilgilerin nereye alınacağı bilgisini içeriyor. @user'den user'e nasıl gelindi bilmiyorum, herhalde form gönderirken @ işareti verilerde sorun yaratıyor ki çıkartılmış.
İkinci dikkat çeken eleman form elemanının kendisi.
Form içindeki submit butonu tıklanınca formdaki verilerin /users adresine POST metodu ile gönderileceğini belirtiyor.
Bir diğer eleman da gizli (görünmeyen) bir eleman.
Bu elemanda gönderilen bilgi Rails tarafından güvenlik amacıyla kullanılıyor.
Başarısız kayıt olma işlemi
Form olayını anlamaya devam etmenin en iyi yolu başarısız kayıt olma işlemi sonucu kullanıcıyı tekrar kayıt olma sayfasına geri göndererek hata mesajlarını vermek olacak.
Çalışan bir form
REST yapıya göre /users adresine POST ile çağrıda bulunulduğunda create eylemi çağrılır, önce kontrolörümüze bu eylemi ekleyelim.
app/controllers/users_controller.rb
Metodun ilkm satırındaki kod , yorumda da belirtildiği gibi son hali değil ancak başlamak için yeterli. Bir de status: :unprocessable_entity argüman değeri var (bu HTTMP status code 422 Unprocessable Entity'ye karşılık geliyor), bu da Turbo kullanırken gerekecek bir şeymiş.
Bu kodu anlamanın en iyi yolu geçersiz bir veri ile formu göndermek. Örneğin tüm kutular boş olarak "Hesabımı Oluştur" butonuna basarsak
Sayfanın en altında bir debug promptu görünüyor, burada tarayıcıdan yapılan çağrıya ait bilgileri görebiliriz, örneğin params değeri.
Burada gördüğümüz user nesnesini incelersek formu üreten kodların oluşturduğu
gibi elemanların içindeki bilgilerin params[:user] içinde nerelere karşı geldiğini anlayabiliriz. name özelliğinde "user[email]" değeri olan kutunun içindeki veri user nesnesinin email özelliğine gelecektir.
Aslında verilen veriler yeni kayıt oluşturmaya engel değil, veri tabanına kaydedilemez, bunu konsolda deneyebiliriz.
Gördüğümüz gibi User.new komutu hata vermiyor. Ancak Rails tarayıcılardan gönderilen verilerde veri tabanına zarar verecek kodlar bulunmasını önlemek amacıyla bir güvenlik kısıtlaması getiriyor.
Güçlü parametreler
Son haline getirilmemiş olduğunu yazdığımız satırdaki
Kodunu kullanarak yeni kullanıcıyı verilen hash değerle oluşturmak aslında oldukça tehlikelidir. İleride User nesnelerine kullanıcının girmeyeceği veriler ekleyebiliriz (şu anda da mesela password_digest böyle bir veri). Bu değerlerle kullanıcıya yetkiler verebiliriz. .bunları kısıtlamazsak curl gibi basit komut satırı araçlar kullanarak sitemize saldırıda bulunabilirler. Diyelim kullanıcı özelliklerinde "admin"=>"1" ise kullanıcıyı yetkili kılıyoruz, kötü amaçlı kişiler kolaylıkla form parametresi olarak "admin"=>"1" değeri de gönderebilirler. Form ile gönderilen özelliklere bir kısıtlama getirmemiz gerekir.
Rails 4.0 sonrasında bu amaçla strong parameters (güçlü parametreler) özelliği kontrolörlere eklendi. Bu sayede hangi parametrelerin zorunlu olduğu ve hangi özelliklere izin verildiğini belirtiriz. Konumuzdaki durumda params hash içinde :user özelliği olmasını istiyoruz ve onun da sadece name, email, password, ve password_confirmation özelliklerinin olmasına izin vermek istiyoruz.
Bu kod params içinde :user özelliği olmasının gerekli olmasını sağlar (eğer params içinde :user özelliği yoksa hata verir). Ayrıca user içinden sadece name, email, password ve password_confirmation özelliklerini içeren bir nesneyi oluşturur. Gelen istekte bu izin verilen özellikler dışında bir özellik varsa kırpılıp atılır.
Bu koddan dönen değeri yeni kullanıcı oluştururken kullanmak için user_params adında bir metod içine koyarak
şeklinde yeni kullanıcı tanımlaması yapabiliriz. Şimdi kontrolör kodumuzun son haline bakalım.
app/controllers/users_controller.rb
Burada metodumuzu private kısmına ekledik. private satırından sonra tanımlanan metodlar dışarıdan çağrılamaz (mesela create çağrılabiliyor), sadece sınıf içinde kullanılabilir.
Bu durumda Rails artık kontrolden geçmiş değerlerle çalışacağı için bir hata mesajı vermez. Ama forma girdiğimiz değerler geçersiz olduğu için tekrar form sayfasına geri dönülür, ve ne yazık ki neden buraya döndüğümüze dair bir bilgi olmadan.
Kayıt sayfası hata mesajları
Son adım olarak geçersiz kayıt bilgilerindeki hatayı bildirecek mesajları sayfaya ekleyeceğiz. Rails bu mesajları model dosyamızdaki geçerlik kurallarına gör otomatik hazırlar. Rails konsolda geçersiz email adresi olan ve şifresi kısa olan bir kayıt ile deneme yapalım.
Eveet , gelen hata mesajından anlaşıldığı üzere Türkçe dönüşüm kullanmak yüzünden sıkıntı yaşıyoruz. Söylemiştim ben kaşındım diye. Şimdi hata mesajlarının da Türkçelerini eklemek zorundayız.
config/locales/tr.yml
Bunların nerelere yazılacağı konsoldaki mesajda görünüyor aslında. Bu satırları ekledikten sonra konsolu kapatıp açıp tekrar deneyelim.
Yandık ki, ne yandık. Olası tüm mesajlar için bir yerlerde komple örnek Türkçe dosyası olsa iyi olurdu. Buradaki errors.full_messages nesnesi hata mesajlarını bir array içinde barındırıyor. Konsolda olduğu gibi kontrolörde de @user nesnesini save etmeye kalkınca başarısız olursa hata mesajları oluşur.
Mesajları tarayıcı sayfasında görüntülemek için error-messages adında bir kısmi görsel kullanacağız. Ayrıca değer giriş kutularında Bootstrap stilleri kullanmak için tüm değer giriş kutularına form-control sınıf değeri ekleyeceğiz.
app/views/users/new.html.erb
Dikkat ettiyseniz burada yayınlanan kısmi görsel adı 'shared/error_messages' olarak girilmiş. Rails'e göre bu dosya app/views klasörü içindeki shared alt klasöründe olmalı. Şu anda bu alt klasör yok bunu terminalden ekleyelim.
Şimdi bu klasör içinde _error_messages.html.erb isimli kısmi görsel dosyasını ekleyelim. Bilindiği üzere kısmi görsel dosya isimleri alt çizgi ile başlar.
app/views/shared/_error_messages.html.erb
Şimdi server'ı çalıştırıp boş form göndermeye kalkarsak yine çeviri hataları gelecek , ama bu sefer sadece bir tekk ekleme ile kurtarırız.
config/locales/tr.yml
Şimdi tekrar boş form gönderirsek
En üstte pluralize metodunun etkisini görmek için metni İngilizce bırakmıştım o da çalışmadı. Bu Türkçe sevdası bize pahalıya patlamaya başladı. Vazgeçtim daha sonra uğraşırım orjinal İngilizce'ye geri dönüyorum.
config/initializers/locale.rb
Daha önceden Rails'in aklında kalan değerleri silmek için de terminalde
Yapıp tekrar kayıt olma sayfasına döndüm. Name ve Password label değerlerini de direk görselde değiştirdim.
app/views/users/new.html.erb
Sayfa normale döndü şimdi boş bir kayıt gönderirsek
Of, rahatladım. Rails öğrenmek yerine Türkçeleştirme ile uğraşıp durmayalım. pluralize metodunun etkisini konsolda deneyebiliriz.
Rails bizden akıllı vallahi. Kısmi görselimizde hata mesajları yayınlanan <div> elemanına error_explanation id değerini verdik. Ek olarak Rails hatalı olan form elemanlarını class değeri field_with_errors olan bir div elemanı ile çevreler. Şimdi stil dosyamıza bu elemanlar için bir stil ekleyelim. Bunu yaparken Sass'ın @extend fonksiyonunu kullanarak Bootstrap has-error sınıfının stillerini stilimize dahil edeceğiz.
app/assets/stylesheets/custom.scss
Şimdi hatalı girilen bilgilerin de etrafı işaretlenmiş olarak gelecektir.
Geçersiz kayıt işlemi için test
Web framework'lerin yapılmasından önce tasarımcılar form girişlerini test işlemlerini elle yapıyordu. Örneğin bu kayıt sayfamızı test edebilmek için tarayıcıda sayfayı açıp geçerli ve geçersiz tüm olası değerlerle tek tek kayıt işlemi denememiz gerekiyordu. Ancak olası değerler arttıkça her seferinde tüm olasılıkları denemeyi atlayabiliriz ve bu çok sıkıcı hatalara sebep olabilir.
Ne iyi ki Rails formları test edebilmek için hazır rutinler tanımladı. Bu kısımda geçersiz bilgiler ile kayıt olmadığını gören testler yazacağız. Daha sonra da geçerli bilgilerle kayıt olduğunu gören testler yazacağız.
Başlamak için kullanıcı kayıtlarına dair bir entegrasyon test dosyası üreteceğiz. İsmini users_signup koyacağız (Rails kontrolör isimlendirme geleneğine uygun olsun diye).
Bu aynı dosyayı ileride geçerli kayıtları test ederken de kullanacağız. Testimizin amacı geçersiz bilgilerle kayıt olma butonuna basıldığında yeni kullanıcı üretilmediğini görmek. Bu amaçla mevcut kullanıcı sayısından yararlanacağız, böylece sayının artıp artmadığından kullanıcı eklendi mi görebiliriz. Konsolda bir denersek.
Kayıtlı kullanıcı sayısı 1 çünkü daha önceki bölümlerde veri tabanına elle bir örnek kullanıcı kaydı yapmıştık. Şimdi test dosyamızın içini dolduralım.
test/integration/users_signup_test.rb
İlk önce kayıt olma sayfasını ziyaret ederek başlıyoruz.
Sanki tarayıcıda GET metodu ile o sayfayı açar gibi. Sonrasında geçersiz bir form gönderme işlemi yapmak için users_path adresine bir POST işlemi yaparak formun gönderilmesini sağlıyoruz.
İlk satır beklentimizi gösteriyor, bloğun içinde yapılan işlem sonucunda User.count değerinin değişmemesini bekliyoruz. Bloğun içinde de bir POST işlemini users_path adresine yapıyoruz. Parametreleri verirken user nesnesinde geçersiz name, email ve password değerler giriyoruz. Bu assert_no_difference bloğu yerine şunu da yapabilirdik.
Ancak yaptığımız şekil daha açıklayıcı görünüyor. Bu noktada şunu da belirtmek gerekir, form gönderme olayını test etmek için sadece POST işlemini yapmak yeterli aslında. Öncesinde GET ile kayıt sayfasını çağırmaya gerek yok, ama onu da bir anlam birliği olsun , sanki tarayıcıdan kullanıcı bunları yapıyor gibi görünsün diye yaptık. Gerçi bana kalsa tarayıcıdan form sayfasını çağırmadan yapılan tüm form gönderme işlerini kabul etmemek lazım, birileri sitemizle uğraşıyorsa biraz sürünsün en azından.
Kayıt sayısının artmamasının ardından 2 beklentimiz daha var.
Daha önce assert_response beklentisinde :success yani başarılı olmasını beklenti olarak görmüştük, ama bu sefer :unprocessable_entity (işlenemeyen girdi) bekliyoruz. Hatırlarsak kontrolörde geçersiz kayıt için aynı durum kodunu dönmesini istemiştik.
assert_template beklentisi ise yaptığımız işlemler sonucunda users/new sayfasına yönlendirilmemizi bekliyor.
Başarılı kayıt işlemi
Geçersiz form bilgisi göndermelerini tamamladıktan sonra sıra geldi veri tabanına geçerli kayıtların eklenmesine. Öncelikle geçerli bilgi girildiğinde save işlemi başarılı olur ve veri tabanına kayıt eklenir, bunun sonucunda da eklenen profilin sayfasına gitmeliyiz. İşlem başarısız olursa neler olacağını daha önce tasarladık ve denedik zaten.
Kayıt formunun bitirilmesi
Çalışan bir kayıt formunu bitirmek için kontrolörümüzde yorum olarak bıraktığımız kısmı tamamlamamız gerekiyor. Şu anda geçerli bilgiler girerek formu göndermeye kalkarsak sayfa donar kalır. Server bildirilerine bakarsak şu mesajı görürüz.
Sayfa değişmedi ama konsola gider bir kontrol edersek veri tabanına yeni bir kayıt eklendi.
Yapmamız gereken şey kontrolörümüze gidip create eyleminden bir görsel dönülmesini eklemek olacak. Bu amaçla redirect_to metodunu kullanacağız.
app/controllers/users_controller.rb
Burada eklediğimiz satır olan
satırı aslında
satırının eşleniğidir.
Flash mesaj
Bir ekleme daha yapacağız, girilen kayıt geçerli olunca yeni kullanıcı sayfasına gideceğiz ya, orada kullanıcıya başarılı olarak giriş yapmasına karşılık bir hoş geldin mesajı verelim. Web sayfalarında buna benzer bildirimler yapmak için Bootstrap css kütüphanesinin alert- ile başlayan sınıfları var. Bunlardan yararlanacağız. Öncelikle flash adını verdiğimiz bir hash değişkene değer girerek görseli çağıralım.
app/controllers/users_controller.rb
Bu flash değişkeni üzerinde çalışmaya örnek olarak konsolda deneme yapabiliriz.
Bu yapıyı ve Bootstrap sınıflarını kullanarak görselimizde flash mesajlarını ekleyebiliriz. Bu mesajlar başka yerlerde de kullanılabilir diyerek bu görsel ilavesini site yerleşim ortak görselimize yapacağız.
Burada flash değişkeninin key değeri mesaj_tipi ve value değeri de mesaj değişkenleri içeriğine konur. Bu durumda
Satırımızın karşılığında
Görsel elemanı oluşur. Şimdi yerleşim görselimize bu ilaveyi yapalım.
app/views/layouts/application.html.erb
Şimdi kayıt olma sistemimiz başarıyla tamamlandı. Sitemize kayıtlara başlayabiliriz.
İlk kullanıcı kaydı
Daha önce denemeler yaparken veri tabanına kaydedilmiş olan tüm kayıtlardan kurtulmak için veri tabanını sıfırlayalım.
Komutumuz sonucunda önce veri tabanları ve veri tabanına eklenen tablolar siliniyor, sonra migrasyonlar tekrar çalıştırılıyor ve tablolar boş olarak geliyor. Konsolda görelim.
Eğer server çalışıyorsa durdurup tekrar başlatmanız gerekir. Şimdi ilk kullanıcımızı tekrar tanımlayalım.
Bu başarılı kayıt işlemi sonucu yeni eklediğimiz kullanıcı sayfasına gidilir ve hoşgeldin mesajı gösterilir.
Sayfayı yenilersek flash mesajı olmadan kullanıcı profil sayfası gelir.
Geçerli kullanıcı kaydı için test
Devam etmeden önce geçerli kayıt işlemi için de bir test yazarak uygulama test bütünlüğümüzü korumaya çalışalım. Daha önce geçersiz kayıt işlemini test etmek için kullanıcı sayısının değişmemesini beklenti olarak yazmıştık, şimdi geçerli kayıt işlemi sonrası veri tabanında mevcut kullanıcı sayısının bir arttığını görmek beklentimiz olacak.
Şeklindeki beklentimize benzer olarak
bloğu ekleyeceğiz. assert_difference bloğundaki işlemler bitirilince User.count değerinin 1 değişmiş olması bekleniyor. Geçerli kayıt işlemi sonucunda redirect ile gönderilen sayfayı da bu testin beklentilerine eklemeliyiz. Şimdi test kodumuza geçerli kayıt için olan bu testi ekleyelim.
test/integration/users_signup_test.rb
Burada follow_redirect! metodu form gönderimi (post) işlemi sonucunda yapılacak yönlendirmeyi yakalamak için kullanılıyor ve bunun sonucunda users/show sayfasına yönlendirme yapılmasını beklenti olarak yazıyoruz.
Bu bölümde öğrendiklerimiz
- Rails debug metodu yardımıyla faydalı debug bilgileri sayfamızda görebiliriz.
- Sass mixin sayesinde bir grup CSS kuralını birçok yerde kullanabiliriz
- Rails development, test ve production ortamlarında çalıştırılabilir
- Kullanıcılarla bir resource üzerinden standart REST adresleriyle etkileşim kurabiliriz.
- Gravatar ile kullanıcı profil resimlerini internette ortak bir yerden kolayca kullanabiliriz
- Rails form_with yardımcı metodu ActiveRecord nesnelerine bağlı form tasarımları yapılır.
- Kayıt hatalarında yeni kullanıcı sayfasına dönülür ve ActiveRecord tarafından üretilen hatalar gösterilir
- Rails flash değişkenini standart mesaj gösterme değişkeni olarak kullanır.
- Başarılı kayıt veri tabanında yeni bir kayıt ekler ve kullanıcı profil sayfasına giderek bir hoş geldin mesajı gösterir
- Form gönderimlerini test etmek için entegrasyon testlerini kullanırız.
Hiç yorum yok:
Yorum Gönder