{"id":31012,"date":"2025-10-04T17:01:50","date_gmt":"2025-10-04T14:01:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/"},"modified":"2025-10-04T17:01:50","modified_gmt":"2025-10-04T14:01:50","slug":"rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/","title":{"rendered":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.<\/p>\n<p>Bir web uygulamas\u0131 geli\u015ftirirken, kullan\u0131c\u0131lar\u0131n girdilerini oldu\u011fu gibi kabul etmek b\u00fcy\u00fck bir hata olabilir. Kullan\u0131c\u0131lar bilerek veya bilmeyerek hatal\u0131, eksik veya k\u00f6t\u00fc niyetli veriler g\u00f6nderebilirler. \u0130\u015fte tam da bu noktada, Rails validasyonlar\u0131 devreye girer ve uygulaman\u0131z\u0131 potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131ndan, veri taban\u0131 tutars\u0131zl\u0131klar\u0131ndan ve k\u00f6t\u00fc kullan\u0131c\u0131 deneyimlerinden korur. Validasyonlar, model seviyesinde, yani veriler veri taban\u0131na kaydedilmeden \u00f6nce devreye giren kurallar b\u00fct\u00fcn\u00fcd\u00fcr.<\/p>\n<p>D\u00fc\u015f\u00fcn\u00fcn ki bir e-ticaret siteniz var ve kullan\u0131c\u0131lar \u00fcr\u00fcn olu\u015ftururken fiyat alan\u0131na metin giriyor, stok miktar\u0131n\u0131 negatif yap\u0131yor ya da \u00fcr\u00fcn ad\u0131n\u0131 bo\u015f b\u0131rak\u0131yor. Bu t\u00fcr hatal\u0131 verilerin veri taban\u0131na kaydedilmesi, uygulaman\u0131zda beklenmedik davran\u0131\u015flara, raporlama hatalar\u0131na ve hatta sistem \u00e7\u00f6k\u00fc\u015flerine yol a\u00e7abilir. Sunucu taraf\u0131nda yap\u0131lan validasyonlar, bu t\u00fcr istenmeyen durumlar\u0131 engellemenin en etkili yoludur. Ayr\u0131ca, sadece sunucu taraf\u0131nda de\u011fil, iyi bir kullan\u0131c\u0131 deneyimi i\u00e7in client-side (taray\u0131c\u0131 taraf\u0131) validasyonlar\u0131n da \u00f6nemi b\u00fcy\u00fckt\u00fcr. Ancak unutulmamal\u0131d\u0131r ki, client-side validasyonlar sadece kullan\u0131c\u0131 kolayl\u0131\u011f\u0131 i\u00e7indir; g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in her zaman sunucu taraf\u0131 validasyonlara g\u00fcvenmek esast\u0131r.<\/p>\n<p>Rails, bu s\u00fcreci Active Record ad\u0131 verilen ORM (Object-Relational Mapping) arac\u0131 sayesinde olduk\u00e7a kolayla\u015ft\u0131r\u0131r. Active Record, modellerinize do\u011frulama kurallar\u0131 eklemek i\u00e7in zengin bir API sunar. Bu sayede, i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 do\u011frudan model katman\u0131nda tan\u0131mlayabilir ve veri tutarl\u0131l\u0131\u011f\u0131n\u0131 merkezi bir yerden sa\u011flayabilirsiniz. Uygulaman\u0131z\u0131n \u00f6l\u00e7e\u011fi b\u00fcy\u00fcd\u00fck\u00e7e, bu merkeziyet\u00e7i yakla\u015f\u0131m, kodunuzun daha temiz, daha s\u00fcrd\u00fcr\u00fclebilir ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flar. Bu b\u00f6l\u00fcmde, validasyonlar\u0131n neden bu kadar kritik oldu\u011funu ve uygulaman\u0131z i\u00e7in ne anlama geldi\u011fini net bir \u015fekilde anlam\u0131\u015f olduk. \u015eimdi, Rails&#8217;in sundu\u011fu temel validasyon yeteneklerine bir g\u00f6z atal\u0131m ve uygulamalar\u0131n\u0131z\u0131 nas\u0131l daha sa\u011flam hale getirebilece\u011finizi ke\u015ffedelim.<\/p>\n<h2>Rails Validasyonlar\u0131n\u0131n Temelleri ve Uygulamal\u0131 Kullan\u0131m\u0131: \u0130lk Ad\u0131mlar\u0131n\u0131z Nas\u0131l Olmal\u0131?<\/h2>\n<p>Rails validasyon d\u00fcnyas\u0131na ilk ad\u0131m\u0131n\u0131z\u0131 atarken, Active Record&#8217;un sundu\u011fu zengin do\u011frulay\u0131c\u0131 k\u00fct\u00fcphanesi ile tan\u0131\u015facaks\u0131n\u0131z. Bu b\u00f6l\u00fcmde, en s\u0131k kullan\u0131lan validat\u00f6rleri derinlemesine inceleyecek, her birinin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 ve nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z. Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flaman\u0131n temel ta\u015flar\u0131 olan bu validasyonlar, model seviyesinde tan\u0131mlanarak verilerinizin veri taban\u0131na kaydedilmeden \u00f6nce belirli kriterleri kar\u015f\u0131lamas\u0131n\u0131 garanti eder.<\/p>\n<h3>Yayg\u0131n Rails Do\u011frulay\u0131c\u0131lar\u0131: Modelinize G\u00fcvenlik Katman\u0131 Ekleyin<\/h3>\n<p>Rails, bir\u00e7ok yayg\u0131n do\u011frulama senaryosu i\u00e7in haz\u0131r metodlar sunar. \u0130\u015fte bunlardan en \u00f6nemlileri:<\/p>\n<ul>\n<li>\n            <strong><code>validates :field, presence: true<\/code>:<\/strong> Bu do\u011frulay\u0131c\u0131, belirli bir alan\u0131n bo\u015f b\u0131rak\u0131lmamas\u0131n\u0131 sa\u011flar. Yani, ilgili alan\u0131n <code>nil<\/code> veya bo\u015f bir string (<code>''<\/code>) olmamas\u0131n\u0131 garanti eder.<\/p>\n<pre><code>\nclass Urun < ApplicationRecord\n  validates :ad, presence: true\n  validates :aciklama, presence: true\nend\n            <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, bir <code>Urun<\/code> objesi kaydedilirken <code>ad<\/code> ve <code>aciklama<\/code> alanlar\u0131n\u0131n dolu olmas\u0131 gerekti\u011fi belirtiliyor. E\u011fer bu alanlardan biri bo\u015f b\u0131rak\u0131l\u0131rsa, \u00fcr\u00fcn kaydedilemeyecek ve hata mesaj\u0131 d\u00f6necektir. Bu, formlardan gelen verilerin eksiksiz oldu\u011fundan emin olman\u0131n en temel yoludur.<\/p>\n<\/li>\n<li>\n            <strong><code>validates :field, length: { minimum: X, maximum: Y }<\/code>:<\/strong> Bir alan\u0131n de\u011ferinin belirli bir uzunluk aral\u0131\u011f\u0131nda olmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca sadece <code>minimum<\/code>, <code>maximum<\/code> veya tam <code>is<\/code> se\u00e7enekleri de kullan\u0131labilir.<\/p>\n<pre><code>\nclass Kullanici < ApplicationRecord\n  validates :kullanici_adi, length: { minimum: 3, maximum: 20 }\n  validates :sifre, length: { in: 6..20, too_short: \"\u00e7ok k\u0131sa, en az 6 karakter olmal\u0131\", too_long: \"\u00e7ok uzun, en fazla 20 karakter olmal\u0131\" }\n  validates :bio, length: { maximum: 500, message: \"en fazla %{count} karakter olabilir\" }\nend\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>kullanici_adi<\/code> 3 ile 20 karakter aras\u0131nda, <code>sifre<\/code> 6 ile 20 karakter aras\u0131nda olmal\u0131 ve <code>bio<\/code> alan\u0131 en fazla 500 karakter uzunlu\u011funda olabilir. \u00d6zel hata mesajlar\u0131 (<code>too_short<\/code>, <code>too_long<\/code>, <code>message<\/code>) ile kullan\u0131c\u0131ya daha a\u00e7\u0131klay\u0131c\u0131 geri bildirimler sunulabilir.<\/p>\n<\/li>\n<li>\n            <strong><code>validates :field, format: { with: \/regex\/ }<\/code>:<\/strong> Bir alan\u0131n de\u011ferinin belirli bir d\u00fczenli ifade (regex) desenine uymas\u0131n\u0131 sa\u011flar. Bu, e-posta adresleri, telefon numaralar\u0131 gibi yap\u0131sal verilere uygunluk denetimi i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\nclass Musteri < ApplicationRecord\n  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP, message: \"ge\u00e7erli bir e-posta adresi de\u011fil\" }\n  validates :telefon_numarasi, format: { with: \/\\A\\d{3}[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\z\/, message: \"ge\u00e7erli bir telefon numaras\u0131 de\u011fil\" }, allow_blank: true\nend\n            <\/pre>\n<p><\/code><\/p>\n<p>E-posta adresi i\u00e7in Rails'in sa\u011flad\u0131\u011f\u0131 <code>URI::MailTo::EMAIL_REGEXP<\/code> sabiti kullan\u0131labilir. Telefon numaras\u0131 i\u00e7in ise kendi d\u00fczenli ifademizi tan\u0131mlad\u0131k. <code>allow_blank: true<\/code> se\u00e7ene\u011fi, alan bo\u015f b\u0131rak\u0131l\u0131rsa format kontrol\u00fc yap\u0131lmamas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n            <strong><code>validates :field, uniqueness: true<\/code>:<\/strong> Bir alan\u0131n de\u011ferinin veri taban\u0131nda benzersiz olmas\u0131n\u0131 sa\u011flar. Kullan\u0131c\u0131 adlar\u0131 veya e-posta adresleri gibi alanlar i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<pre><code>\nclass Kullanici < ApplicationRecord\n  validates :email, uniqueness: { case_sensitive: false, message: \"bu e-posta adresi zaten kullan\u0131l\u0131yor\" }\n  validates :kullanici_adi, uniqueness: true\nend\n            <\/pre>\n<p><\/code><\/p>\n<p><code>case_sensitive: false<\/code> se\u00e7ene\u011fi, b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyars\u0131z bir benzersizlik kontrol\u00fc sa\u011flar. Bu, \"user@example.com\" ile \"User@example.com\" adreslerinin ayn\u0131 kabul edilmesini sa\u011flar. Veritaban\u0131n\u0131z\u0131n b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyarl\u0131l\u0131\u011f\u0131na g\u00f6re bu ayar\u0131 d\u00fczenlemek \u00f6nemlidir.<\/p>\n<\/li>\n<li>\n            <strong><code>validates :field, numericality: { greater_than: X, less_than_or_equal_to: Y }<\/code>:<\/strong> Bir alan\u0131n say\u0131sal bir de\u011fer olmas\u0131n\u0131 ve belirli bir aral\u0131kta bulunmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\nclass Urun < ApplicationRecord\n  validates :fiyat, numericality: { greater_than: 0, less_than_or_equal_to: 10000, message: \"ge\u00e7erli bir fiyat olmal\u0131 (0-10000 aras\u0131)\" }\n  validates :stok_miktari, numericality: { only_integer: true, greater_than_or_equal_to: 0, message: \"pozitif bir tam say\u0131 olmal\u0131\" }\nend\n            <\/pre>\n<p><\/code><\/p>\n<p><code>only_integer: true<\/code> ile sadece tam say\u0131 olmas\u0131na izin verilir. <code>greater_than_or_equal_to<\/code> gibi se\u00e7eneklerle daha esnek say\u0131sal k\u0131s\u0131tlamalar getirilebilir.<\/p>\n<\/li>\n<li>\n            <strong><code>validates :field, inclusion: { in: %w[secenek1 secenek2], message: \"ge\u00e7ersiz bir se\u00e7enektir\" }<\/code>:<\/strong> Bir alan\u0131n de\u011ferinin belirli bir se\u00e7enek listesinden birine ait olmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\nclass Gorev < ApplicationRecord\n  STATUS_LER = ['beklemede', 'devam ediyor', 'tamamland\u0131']\n  validates :durum, inclusion: { in: STATUS_LER, message: \"ge\u00e7ersiz bir durumdur\" }\nend\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu, genellikle sabit se\u00e7enek listeleri (dropdown men\u00fcler, radio butonlar) i\u00e7in kullan\u0131l\u0131r.<\/p>\n<\/li>\n<\/ul>\n<h3>Uygulamal\u0131 \u00d6rnek: Bir Blog Yaz\u0131s\u0131 Modeli \u0130\u00e7in Validasyonlar<\/h3>\n<p>\u015eimdi t\u00fcm bu \u00f6\u011frendiklerimizi bir araya getirerek ger\u00e7ek\u00e7i bir senaryo olu\u015ftural\u0131m. Bir blog uygulamas\u0131 geli\u015ftirdi\u011fimizi ve <code>Yazi<\/code> ad\u0131nda bir modelimiz oldu\u011funu varsayal\u0131m. Bu model i\u00e7in \u00e7e\u015fitli do\u011frulama kurallar\u0131 uygulayal\u0131m:<\/p>\n<pre><code>\n# app\/models\/yazi.rb\nclass Yazi < ApplicationRecord\n  validates :baslik, presence: { message: \"ba\u015fl\u0131k bo\u015f b\u0131rak\u0131lamaz\" },\n                     length: { minimum: 5, maximum: 100, message: \"ba\u015fl\u0131k 5 ile 100 karakter aras\u0131nda olmal\u0131\" },\n                     uniqueness: { case_sensitive: false, message: \"bu ba\u015fl\u0131k zaten kullan\u0131l\u0131yor\" }\n\n  validates :icerik, presence: { message: \"i\u00e7erik bo\u015f b\u0131rak\u0131lamaz\" },\n                     length: { minimum: 50, message: \"i\u00e7erik en az 50 karakter olmal\u0131\" }\n\n  validates :yazar_email, format: { with: URI::MailTo::EMAIL_REGEXP, message: \"ge\u00e7erli bir e-posta adresi giriniz\" },\n                          allow_blank: true\n\n  validates :okuma_suresi_dakika, numericality: { only_integer: true,\n                                                greater_than: 0,\n                                                less_than_or_equal_to: 60,\n                                                message: \"okuma s\u00fcresi 1-60 dakika aras\u0131nda bir tam say\u0131 olmal\u0131\" },\n                                allow_nil: true # Bo\u015f b\u0131rak\u0131labilir\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda, <code>Yazi<\/code> modelimiz i\u00e7in kapsaml\u0131 validasyonlar tan\u0131mlad\u0131k. Ba\u015fl\u0131k, i\u00e7erik, yazar e-postas\u0131 ve okuma s\u00fcresi alanlar\u0131 i\u00e7in farkl\u0131 k\u0131s\u0131tlamalar belirledik. <code>allow_blank: true<\/code> veya <code>allow_nil: true<\/code> gibi se\u00e7eneklerle belirli durumlarda alan\u0131n bo\u015f veya <code>nil<\/code> olmas\u0131na izin vererek esneklik sa\u011flad\u0131k.<\/p>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: Validasyon kurallar\u0131n\u0131z\u0131 sadece modelinizde de\u011fil, ayn\u0131 zamanda veri taban\u0131 seviyesinde de uygulamay\u0131 d\u00fc\u015f\u00fcnebilirsiniz (\u00f6rne\u011fin, <code>NOT NULL<\/code> veya <code>UNIQUE<\/code> k\u0131s\u0131tlamalar\u0131). Bu, ek bir g\u00fcvenlik katman\u0131 sa\u011flar ve uygulama katman\u0131ndaki bir hatan\u0131n veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc bozmas\u0131n\u0131 engeller. Ancak hata mesajlar\u0131n\u0131n kullan\u0131c\u0131ya d\u00f6nmesi i\u00e7in model validasyonlar\u0131 yine de \u015fartt\u0131r.\n    <\/div>\n<p>Bir model objesini kaydetmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda ve validasyonlar ba\u015far\u0131s\u0131z oldu\u011funda, <code>errors<\/code> objesi arac\u0131l\u0131\u011f\u0131yla hangi alanlarda hangi hatalar\u0131n olu\u015ftu\u011funu g\u00f6rebilirsiniz:<\/p>\n<pre><code>\n# Rails konsolunda deneyelim\nyazi = Yazi.new(baslik: \"K\u0131sa\", icerik: \"\u00c7ok k\u0131sa i\u00e7erik.\", yazar_email: \"ge\u00e7ersiz-email\")\nyazi.valid? # => false\nyazi.errors.full_messages\n# => [\"Ba\u015fl\u0131k 5 ile 100 karakter aras\u0131nda olmal\u0131\", \"\u0130\u00e7erik en az 50 karakter olmal\u0131\", \"Yazar email ge\u00e7erli bir e-posta adresi giriniz\"]\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu b\u00f6l\u00fcm, Rails validasyonlar\u0131n\u0131n temel yap\u0131 ta\u015flar\u0131n\u0131 ve modelinize nas\u0131l entegre edece\u011finizi size g\u00f6sterdi. Art\u0131k verilerinizi daha bilin\u00e7li ve kontroll\u00fc bir \u015fekilde y\u00f6netebilirsiniz. Ancak Rails validasyonlar\u0131 sadece bu kadarla s\u0131n\u0131rl\u0131 de\u011fil. \u00d6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re validasyonlar\u0131n\u0131z\u0131 nas\u0131l \u015fekillendirebilece\u011finizi bir sonraki b\u00f6l\u00fcmde inceleyece\u011fiz.<\/p>\n<h2>\u00d6zel Validasyonlar ve Ko\u015fullu Mant\u0131k: \u0130htiya\u00e7lar\u0131n\u0131za G\u00f6re Nas\u0131l \u015eekillendirilir?<\/h2>\n<p>Haz\u0131r Rails validat\u00f6rleri \u00e7o\u011fu senaryo i\u00e7in yeterli olsa da, bazen uygulaman\u0131z\u0131n benzersiz i\u015f mant\u0131\u011f\u0131na uyan daha karma\u015f\u0131k do\u011frulama kurallar\u0131na ihtiya\u00e7 duyabilirsiniz. Rails, bu t\u00fcr durumlar i\u00e7in \u00f6zel validasyon metodlar\u0131 ve ko\u015fullu validasyonlar arac\u0131l\u0131\u011f\u0131yla b\u00fcy\u00fck bir esneklik sunar. Bu b\u00f6l\u00fcmde, bu ileri d\u00fczey teknikleri nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve validasyon s\u00fcre\u00e7lerinizi nas\u0131l daha ak\u0131ll\u0131 hale getirece\u011finizi \u00f6\u011freneceksiniz.<\/p>\n<h3>Kendi Validasyon Metodlar\u0131n\u0131z\u0131 Tan\u0131mlamak: \u0130\u015f Mant\u0131\u011f\u0131n\u0131za \u00d6zel Kurallar<\/h3>\n<p>Rails, bir alan\u0131n de\u011ferini belirli bir kurallar dizisine g\u00f6re do\u011frulamak istedi\u011finizde, modele do\u011frudan kendi validasyon metodlar\u0131n\u0131z\u0131 eklemenize olanak tan\u0131r. Bu metodlar, <code>validate<\/code> veya <code>validate_on_create<\/code>\/<code>validate_on_update<\/code> gibi callback'ler arac\u0131l\u0131\u011f\u0131yla \u00e7a\u011fr\u0131l\u0131r. En yayg\u0131n kullan\u0131lan\u0131 <code>validate<\/code> callback'idir ve model kaydedilmeden veya g\u00fcncellenmeden \u00f6nce \u00e7al\u0131\u015f\u0131r.<\/p>\n<pre><code>\n# app\/models\/siparis.rb\nclass Siparis < ApplicationRecord\n  # Sipari\u015f tarihi gelecekte olamaz\n  validate :siparis_tarihi_gecmiste_olmal\u0131\n\n  # Teslimat adresi girildiyse, teslimat_tarihi de girilmeli\n  validate :teslimat_bilgilerini_dogrula, if: -> { teslimat_adresi.present? }\n\n  private\n\n  def siparis_tarihi_gecmiste_olmal\u0131\n    if siparis_tarihi.present? && siparis_tarihi > Date.current\n      errors.add(:siparis_tarihi, \"gelecekte olamaz\")\n    end\n  end\n\n  def teslimat_bilgilerini_dogrula\n    unless teslimat_tarihi.present?\n      errors.add(:teslimat_tarihi, \"teslimat adresi girildiyse bo\u015f b\u0131rak\u0131lamaz\")\n    end\n    # ... ba\u015fka teslimat ile ilgili kurallar ...\n  end\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>siparis_tarihi_gecmiste_olmal\u0131<\/code> metodu, sipari\u015f tarihinin bug\u00fcnden sonra olmamas\u0131n\u0131 kontrol eder. E\u011fer bir sorun varsa, <code>errors.add<\/code> metodu ile ilgili alana hata eklenir. \u0130kinci metod olan <code>teslimat_bilgilerini_dogrula<\/code> ise <code>if: -> { teslimat_adresi.present? }<\/code> ko\u015fulu ile sadece <code>teslimat_adresi<\/code> alan\u0131 doldurulmu\u015fsa \u00e7al\u0131\u015f\u0131r. Bu, karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan validasyonlar i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>Ko\u015fullu Validasyonlar: Duruma G\u00f6re De\u011fi\u015fen Kurallar<\/h3>\n<p>Validasyonlar\u0131n belirli ko\u015fullar alt\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>if<\/code> ve <code>unless<\/code> se\u00e7eneklerini kullanabilirsiniz. Bu, bir alan\u0131n ge\u00e7erlili\u011finin ba\u015fka bir alan\u0131n de\u011ferine veya modelin durumuna ba\u011fl\u0131 oldu\u011fu durumlarda \u00e7ok i\u015fe yarar.<\/p>\n<ul>\n<li>\n            <strong><code>if: :method_name<\/code> veya <code>if: -> { some_condition }<\/code>:<\/strong> Belirtilen metod <code>true<\/code> d\u00f6nerse veya lambda ifadesi <code>true<\/code> d\u00f6nerse validasyon \u00e7al\u0131\u015f\u0131r.\n        <\/li>\n<li>\n            <strong><code>unless: :method_name<\/code> veya <code>unless: -> { some_condition }<\/code>:<\/strong> Belirtilen metod <code>false<\/code> d\u00f6nerse veya lambda ifadesi <code>false<\/code> d\u00f6nerse validasyon \u00e7al\u0131\u015f\u0131r.\n        <\/li>\n<\/ul>\n<p>Yukar\u0131daki <code>Siparis<\/code> \u00f6rne\u011finde <code>if: -> { teslimat_adresi.present? }<\/code> ile bir lambda ifadesi kullanarak ko\u015fullu validasyon g\u00f6rm\u00fc\u015ft\u00fck. \u015eimdi ba\u015fka bir \u00f6rnek verelim:<\/p>\n<pre><code>\n# app\/models\/anket.rb\nclass Anket < ApplicationRecord\n  validates :aciklama, presence: true, if: :acik_uc_anket?\n  validates :son_tarih, presence: true, unless: :taslak_halinde?\n\n  private\n\n  def acik_uc_anket?\n    self.tur == 'a\u00e7\u0131k u\u00e7lu'\n  end\n\n  def taslak_halinde?\n    self.durum == 'taslak'\n  end\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Anket<\/code> modelinde, e\u011fer anketin <code>tur<\/code>'u 'a\u00e7\u0131k u\u00e7lu' ise <code>aciklama<\/code> alan\u0131 zorunlu hale gelir (<code>if: :acik_uc_anket?<\/code>). Ayr\u0131ca, e\u011fer anket <code>taslak<\/code> durumunda de\u011filse, <code>son_tarih<\/code> alan\u0131n\u0131n bo\u015f b\u0131rak\u0131lamayaca\u011f\u0131 (<code>unless: :taslak_halinde?<\/code>) belirtilmi\u015ftir. Bu sayede, uygulaman\u0131zdaki farkl\u0131 i\u015f ak\u0131\u015flar\u0131na g\u00f6re validasyon kurallar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirebilirsiniz.<\/p>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: Ko\u015fullu validasyonlar\u0131 kullan\u0131rken, ko\u015ful metodlar\u0131n\u0131z\u0131n basit ve anla\u015f\u0131l\u0131r olmas\u0131na \u00f6zen g\u00f6sterin. Karma\u015f\u0131k mant\u0131\u011f\u0131 k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir metodlara b\u00f6lmek, kodunuzu daha okunabilir ve bak\u0131m\u0131 kolay hale getirir.\n    <\/div>\n<h3>\u00d6zel Validat\u00f6r S\u0131n\u0131flar\u0131 Olu\u015fturmak: Yeniden Kullan\u0131labilir ve Temiz Validasyonlar<\/h3>\n<p>E\u011fer ayn\u0131 validasyon mant\u0131\u011f\u0131n\u0131 birden fazla modelde veya farkl\u0131 ba\u011flamlarda kullanman\u0131z gerekiyorsa, \u00f6zel bir validat\u00f6r s\u0131n\u0131f\u0131 olu\u015fturmak en iyi yakla\u015f\u0131md\u0131r. Bu, DRY (Don't Repeat Yourself) prensibine uyman\u0131z\u0131 sa\u011flar ve kod tekrar\u0131n\u0131 \u00f6nler.<\/p>\n<p>\u00d6zel validat\u00f6r s\u0131n\u0131flar\u0131 <code>ActiveModel::EachValidator<\/code> veya <code>ActiveModel::Validator<\/code>'dan t\u00fcretilebilir. <code>ActiveModel::EachValidator<\/code>, bir alan\u0131n de\u011ferini do\u011frulamak i\u00e7in kullan\u0131l\u0131rken, <code>ActiveModel::Validator<\/code> t\u00fcm objeyi do\u011frulayabilir.<\/p>\n<p><strong>\u00d6rnek: E-posta Alan\u0131n\u0131 Kara Listeye G\u00f6re Do\u011frulayan Bir Validat\u00f6r<\/strong><\/p>\n<pre><code>\n# app\/validators\/kara_liste_email_validator.rb\nclass KaraListeEmailValidator < ActiveModel::EachValidator\n  def validate_each(record, attribute, value)\n    kara_liste_domainler = ['spammer.com', 'tempmail.com']\n    if value.present? &#038;&#038; kara_liste_domainler.any? { |domain| value.include?(domain) }\n      record.errors.add(attribute, (options[:message] || \"bu domainden e-posta kabul edilmiyor\"))\n    end\n  end\nend\n\n# app\/models\/kullanici.rb\nclass Kullanici < ApplicationRecord\n  validates :email, presence: true, kara_liste_email: true\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>KaraListeEmailValidator<\/code> ad\u0131nda \u00f6zel bir validat\u00f6r olu\u015fturduk. Bu validat\u00f6r, kullan\u0131c\u0131n\u0131n e-posta adresinin kara listedeki domainlerden birini i\u00e7erip i\u00e7ermedi\u011fini kontrol eder. Ard\u0131ndan, <code>Kullanici<\/code> modelinde <code>validates :email, kara_liste_email: true<\/code> \u015feklinde kolayca kullanabiliriz. <code>options[:message]<\/code> sayesinde, validat\u00f6r\u00fc kullan\u0131rken \u00f6zel bir hata mesaj\u0131 da belirleyebiliriz (\u00f6rne\u011fin: <code>validates :email, kara_liste_email: { message: \"kay\u0131tl\u0131 olmayan bir e-posta adresi kullan\u0131lamaz\" }<\/code>).<\/p>\n<p>Bu b\u00f6l\u00fcmde, Rails validasyonlar\u0131n\u0131n s\u0131n\u0131rlar\u0131n\u0131 nas\u0131l geni\u015fletebilece\u011finizi, i\u015f mant\u0131\u011f\u0131n\u0131za \u00f6zel kurallar ekleyebilece\u011finizi ve kodu yeniden kullan\u0131labilir hale getirebilece\u011finizi \u00f6\u011frendiniz. Bu sayede, daha karma\u015f\u0131k ve dinamik do\u011frulama ihtiya\u00e7lar\u0131n\u0131z\u0131 kolayl\u0131kla kar\u015f\u0131layabilirsiniz. Ancak, t\u00fcm bu validasyonlar\u0131n sonucunda kullan\u0131c\u0131ya g\u00f6sterilecek hata mesajlar\u0131n\u0131n nas\u0131l y\u00f6netilece\u011fi de \u00f6nemli bir konudur.<\/p>\n<h2>Hata Mesajlar\u0131n\u0131 Y\u00f6netmek ve \u0130leri D\u00fczey Teknikler: Kullan\u0131c\u0131 Deneyimini Nas\u0131l Zenginle\u015ftirirsiniz?<\/h2>\n<p>Validasyonlar, bir objenin ge\u00e7erlili\u011fini sa\u011flasa da, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hata mesajlar\u0131n\u0131n anla\u015f\u0131l\u0131r, a\u00e7\u0131klay\u0131c\u0131 ve kullan\u0131\u015fl\u0131 olmas\u0131 kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, Rails'te hata mesajlar\u0131n\u0131 nas\u0131l \u00f6zelle\u015ftirece\u011finizi, farkl\u0131 validasyon ba\u011flamlar\u0131n\u0131 nas\u0131l y\u00f6netece\u011finizi ve daha karma\u015f\u0131k senaryolar i\u00e7in ileri d\u00fczey teknikleri nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h3>Kullan\u0131c\u0131 Dostu Hata Mesajlar\u0131: Geri Bildirimi Optimize Etmek<\/h3>\n<p>Rails, varsay\u0131lan olarak olduk\u00e7a genel hata mesajlar\u0131 \u00fcretir (\u00f6rne\u011fin, \"Ba\u015fl\u0131k bo\u015f b\u0131rak\u0131lamaz\"). Ancak, bu mesajlar\u0131 uygulaman\u0131z\u0131n tonuna ve kullan\u0131c\u0131lar\u0131n\u0131z\u0131n anlayabilece\u011fi \u015fekilde \u00f6zelle\u015ftirmek, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Hata mesajlar\u0131n\u0131 \u00f6zelle\u015ftirmenin birka\u00e7 yolu vard\u0131r:<\/p>\n<ol>\n<li>\n            <strong>Validat\u00f6r Se\u00e7enekleri ile Do\u011frudan \u00d6zelle\u015ftirme:<\/strong> Her bir validat\u00f6re <code>message<\/code> se\u00e7ene\u011fi ekleyerek do\u011frudan \u00f6zelle\u015ftirme yapabilirsiniz.<\/p>\n<pre><code>\nclass Urun < ApplicationRecord\n  validates :ad, presence: { message: \"\u00dcr\u00fcn ad\u0131 alan\u0131 doldurulmal\u0131d\u0131r.\" }\n  validates :stok_miktari, numericality: { greater_than_or_equal_to: 0, message: \"%{value} ge\u00e7erli bir stok miktar\u0131 de\u011fildir, pozitif bir say\u0131 olmal\u0131.\" }\nend\n            <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>%{value}<\/code> gibi yer tutucular kullanarak, hata mesaj\u0131na do\u011frulama hatas\u0131na neden olan de\u011feri dinamik olarak ekleyebilirsiniz.<\/p>\n<\/li>\n<li>\n            <strong>Uluslararas\u0131la\u015ft\u0131rma (I18n) ile \u00d6zelle\u015ftirme:<\/strong> Rails, hata mesajlar\u0131n\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir I18n (Internationalization) sistemi sunar. Bu, \u00f6zellikle \u00e7ok dilli uygulamalar i\u00e7in idealdir.<\/p>\n<p><code>config\/locales\/tr.yml<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki gibi eklemeler yapabilirsiniz:<\/p>\n<pre><code>\n# config\/locales\/tr.yml\ntr:\n  activerecord:\n    attributes:\n      urun:\n        ad: \"\u00dcr\u00fcn Ad\u0131\"\n        stok_miktari: \"Stok Miktar\u0131\"\n    errors:\n      models:\n        urun:\n          attributes:\n            ad:\n              blank: \"bo\u015f b\u0131rak\u0131lamaz, l\u00fctfen bir ad girin.\"\n            stok_miktari:\n              not_a_number: \"ge\u00e7erli bir say\u0131 olmal\u0131.\"\n              greater_than_or_equal_to: \"en az %{count} olmal\u0131.\"\n      messages:\n        presence: \"bo\u015f b\u0131rak\u0131lamaz\" # Genel bir mesaj\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, model, nitelik ve validat\u00f6r tipine g\u00f6re hata mesajlar\u0131n\u0131 hiyerar\u015fik olarak tan\u0131mlayabilirsiniz. Rails, en spesifik mesaj\u0131 bulmaya \u00e7al\u0131\u015f\u0131r. \u00d6rne\u011fin, <code>urun.ad<\/code> i\u00e7in <code>blank<\/code> hatas\u0131 olu\u015ftu\u011funda \u00f6nce <code>activerecord.errors.models.urun.attributes.ad.blank<\/code>'i arar, bulamazsa daha genel olanlara y\u00f6nelir.<\/p>\n<\/li>\n<\/ol>\n<h3>Validasyon Ba\u011flamlar\u0131 (Contexts): Farkl\u0131 \u0130\u015flemler \u0130\u00e7in Farkl\u0131 Kurallar<\/h3>\n<p>Bazen ayn\u0131 modelin farkl\u0131 i\u015flemler s\u0131ras\u0131nda farkl\u0131 validasyon kurallar\u0131na uymas\u0131 gerekebilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 kayd\u0131 s\u0131ras\u0131nda daha az k\u0131s\u0131tlay\u0131c\u0131 kurallar uygulan\u0131rken, profil g\u00fcncelleme s\u0131ras\u0131nda daha fazla alan\u0131n zorunlu olmas\u0131 istenebilir. Rails, <code>on: :create<\/code> veya <code>on: :update<\/code> gibi se\u00e7eneklerle veya \u00f6zel ba\u011flamlarla (contexts) bu senaryoyu y\u00f6netmenizi sa\u011flar.<\/p>\n<pre><code>\nclass Kullanici < ApplicationRecord\n  validates :email, presence: true, uniqueness: true\n  validates :sifre, presence: true, length: { minimum: 6 }, on: :create # Sadece olu\u015ftururken \u015fifre zorunlu\n  validates :telefon_numarasi, presence: true, on: :profil_guncelleme # Sadece profil g\u00fcncellerken zorunlu\n\n  # Modelinizi bir ba\u011flamla kaydetmek i\u00e7in:\n  # user.save(context: :profil_guncelleme)\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>sifre<\/code> alan\u0131 sadece <code>Kullanici<\/code> objesi olu\u015fturulurken zorunlu tutulmu\u015ftur (<code>on: :create<\/code>). Ayr\u0131ca, <code>telefon_numarasi<\/code> alan\u0131 i\u00e7in <code>profil_guncelleme<\/code> ad\u0131nda \u00f6zel bir ba\u011flam tan\u0131mlad\u0131k. Bu validasyon, sadece <code>user.save(context: :profil_guncelleme)<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facakt\u0131r. Varsay\u0131lan olarak, <code>save<\/code> metodu herhangi bir ba\u011flam belirtilmedi\u011finde <code>:create<\/code> veya <code>:update<\/code> ba\u011flamlar\u0131n\u0131 otomatik olarak kullan\u0131r.<\/p>\n<h3>Callback'ler ile Validasyon Mant\u0131\u011f\u0131n\u0131 Geni\u015fletmek<\/h3>\n<p>Rails'in callback sistemi, validasyon s\u00fcre\u00e7lerinize ek mant\u0131k katmanlar\u0131 eklemek i\u00e7in g\u00fc\u00e7l\u00fc bir yol sunar. <code>before_validation<\/code>, <code>after_validation<\/code> gibi callback'ler ile bir objenin kaydedilmeden \u00f6nceki ve sonraki durumlar\u0131na m\u00fcdahale edebilirsiniz.<\/p>\n<pre><code>\nclass Yazi < ApplicationRecord\n  before_validation :basligi_buyuk_harfe_cevir\n\n  validates :baslik, presence: true\n\n  private\n\n  def basligi_buyuk_harfe_cevir\n    self.baslik = self.baslik.upcase if self.baslik.present?\n  end\nend\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>basligi_buyuk_harfe_cevir<\/code> metodu, validasyonlar \u00e7al\u0131\u015ft\u0131r\u0131lmadan hemen \u00f6nce \u00e7a\u011fr\u0131l\u0131r ve <code>baslik<\/code> alan\u0131n\u0131n de\u011ferini b\u00fcy\u00fck harfe \u00e7evirir. Bu, verileri do\u011frulamadan \u00f6nce \u00f6n i\u015flem yapmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<div class=\"interactive-tip\">\n      Uzman \u0130pucu: Callback'leri dikkatli kullan\u0131n. \u00c7ok fazla callback veya karma\u015f\u0131k callback zincirleri, uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 tahmin etmeyi zorla\u015ft\u0131rabilir. Basit veri manip\u00fclasyonlar\u0131 i\u00e7in kullanmak idealdir, karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 genellikle ayr\u0131 servis objelerinde daha iyi yer al\u0131r.\n    <\/div>\n<h3>Client-Side Validasyon ve Mobil Uyumluluk: Kullan\u0131c\u0131 Deneyimini Tamamlamak<\/h3>\n<p>Rails validasyonlar\u0131 a\u011f\u0131rl\u0131kl\u0131 olarak sunucu taraf\u0131nda \u00e7al\u0131\u015fsa da, h\u0131zl\u0131 ve kullan\u0131c\u0131 dostu bir deneyim i\u00e7in client-side (taray\u0131c\u0131 taraf\u0131) validasyonlar da \u00f6nemlidir. Client-side validasyonlar, kullan\u0131c\u0131 bir formu g\u00f6nderdi\u011finde, verilerin sunucuya gitmesine gerek kalmadan an\u0131nda geri bildirim sa\u011flar.<\/p>\n<p>Client-side validasyonlar, genellikle JavaScript k\u00fct\u00fcphaneleri (\u00f6rne\u011fin, Vue.js, React, veya jQuery tabanl\u0131 k\u00fct\u00fcphaneler) veya HTML5'in yerle\u015fik form do\u011frulama \u00f6zellikleriyle (<code>required<\/code>, <code>pattern<\/code>, <code>min<\/code>, <code>max<\/code> gibi nitelikler) uygulan\u0131r.<\/p>\n<pre><code class=\"language-html\">\n<form action=\"\/kaydet\" method=\"post\">\n  <label for=\"ad\">Ad\u0131n\u0131z:<\/label>\n  <input type=\"text\" id=\"ad\" name=\"kullanici[ad]\" required minlength=\"3\" maxlength=\"50\"><br><br>\n\n  <label for=\"email\">E-posta:<\/label>\n  <input type=\"email\" id=\"email\" name=\"kullanici[email]\" required><br><br>\n\n  <!-- Mobil cihazlarda daha iyi g\u00f6r\u00fcnmesi i\u00e7in bir kapsay\u0131c\u0131 -->\n  <div class=\"form-group\">\n    <label for=\"sifre\">\u015eifre:<\/label>\n    <input type=\"password\" id=\"sifre\" name=\"kullanici[sifre]\" required pattern=\"(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}\" title=\"En az bir b\u00fcy\u00fck harf, bir k\u00fc\u00e7\u00fck harf, bir rakam ve 8+ karakter i\u00e7ermeli.\">\n  <\/div>\n\n  <input type=\"submit\" value=\"Kaydol\">\n<\/form>\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki HTML5 \u00f6rne\u011finde, <code>required<\/code>, <code>minlength<\/code>, <code>maxlength<\/code> ve <code>pattern<\/code> gibi nitelikler kullan\u0131larak taray\u0131c\u0131 seviyesinde temel validasyonlar sa\u011flanm\u0131\u015ft\u0131r. Bu, \u00f6zellikle mobil kullan\u0131c\u0131lar i\u00e7in h\u0131zl\u0131 geri bildirim sunar ve gereksiz sunucu isteklerini azalt\u0131r.<\/p>\n<p><strong>Mobil uyumlu bir form i\u00e7in CSS \u00f6rne\u011fi (konsept):<\/strong><\/p>\n<pre><code class=\"language-css\">\n\/* Bu kod normalde bir .css dosyas\u0131na eklenir, body etiketine dahil edilmez *\/\n@media screen and (max-width: 768px) {\n  .form-group {\n    flex-direction: column; \/* Mobil cihazlarda elementleri alt alta s\u0131rala *\/\n    margin-bottom: 15px;\n  }\n\n  .form-group label {\n    margin-bottom: 5px;\n    font-size: 0.9em;\n  }\n\n  .form-group input[type=\"text\"],\n  .form-group input[type=\"email\"],\n  .form-group input[type=\"password\"] {\n    width: 100%;\n    padding: 10px;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n    box-sizing: border-box; \/* padding ve border'\u0131n geni\u015fli\u011fe dahil olmas\u0131n\u0131 sa\u011flar *\/\n  }\n\n  .form-group input:invalid {\n    border-color: red; \/* Hatal\u0131 inputlar\u0131 k\u0131rm\u0131z\u0131 \u00e7er\u00e7eveyle g\u00f6ster *\/\n  }\n\n  .form-group input:invalid + .error-message {\n    display: block; \/* Hata mesaj\u0131n\u0131 g\u00f6ster *\/\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu konsept CSS blo\u011fu, form elemanlar\u0131n\u0131n mobil cihazlarda daha okunakl\u0131 ve kullan\u0131labilir olmas\u0131n\u0131 sa\u011flamak i\u00e7in bir media query \u00f6rne\u011fi sunar. <code>input:invalid<\/code> se\u00e7icisi ile HTML5 validasyonlar\u0131n\u0131n ba\u015far\u0131s\u0131z oldu\u011fu alanlar\u0131 g\u00f6rsel olarak vurgulayabilirsiniz. Ancak, <strong>her zaman unutulmamal\u0131d\u0131r ki, client-side validasyonlar yaln\u0131zca kullan\u0131c\u0131 kolayl\u0131\u011f\u0131 i\u00e7indir; g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in sunucu taraf\u0131 validasyonlar olmazsa olmazd\u0131r.<\/strong><\/p>\n<p>Bu b\u00f6l\u00fcmde, hata mesajlar\u0131n\u0131 nas\u0131l daha anlaml\u0131 hale getirebilece\u011finizi, farkl\u0131 durumlar i\u00e7in farkl\u0131 validasyon kurallar\u0131 uygulayabilece\u011finizi ve client-side tekniklerle kullan\u0131c\u0131 deneyimini nas\u0131l tamamlayabilece\u011finizi g\u00f6rd\u00fck. Rails'in sundu\u011fu bu zengin ara\u00e7 seti, uygulaman\u0131z\u0131 her a\u00e7\u0131dan sa\u011flam ve kullan\u0131c\u0131 dostu hale getirmenize olanak tan\u0131r.<\/p>\n<h2>Sonu\u00e7: Sa\u011flam Uygulamalar\u0131n Temeli ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Rails validasyonlar\u0131, herhangi bir web uygulamas\u0131n\u0131n temel ta\u015flar\u0131ndan biridir. Bu rehber boyunca, basit <code>presence<\/code> kontrol\u00fcnden \u00f6zel validat\u00f6r s\u0131n\u0131flar\u0131na, ko\u015fullu mant\u0131ktan uluslararas\u0131la\u015ft\u0131r\u0131lm\u0131\u015f hata mesajlar\u0131na kadar Rails'in sundu\u011fu do\u011frulama mekanizmalar\u0131n\u0131n geni\u015f yelpazesini ke\u015ffettik. Veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flaman\u0131n, potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapatman\u0131n ve kullan\u0131c\u0131lar\u0131n\u0131za ak\u0131c\u0131 bir deneyim sunman\u0131n anahtar\u0131n\u0131n do\u011fru ve kapsaml\u0131 validasyonlardan ge\u00e7ti\u011fini g\u00f6rd\u00fck. Unutmay\u0131n ki, sa\u011flam bir uygulaman\u0131n temeli, gelen verilerin g\u00fcvenilirli\u011fi \u00fczerine in\u015fa edilir ve Rails bu konuda size g\u00fc\u00e7l\u00fc ara\u00e7lar sunar.<\/p>\n<p>\u00d6zellikle dikkat edilmesi gerekenler aras\u0131nda:<\/p>\n<ul>\n<li>Her zaman sunucu taraf\u0131 validasyonlara g\u00fcvenin; client-side validasyonlar sadece kullan\u0131c\u0131 deneyimi i\u00e7indir.<\/li>\n<li>\u0130\u015f mant\u0131\u011f\u0131n\u0131z\u0131 en iyi yans\u0131tan validasyon tipini se\u00e7in (haz\u0131r validat\u00f6rler, \u00f6zel metodlar veya \u00f6zel s\u0131n\u0131flar).<\/li>\n<li>Hata mesajlar\u0131n\u0131 kullan\u0131c\u0131 dostu ve a\u00e7\u0131klay\u0131c\u0131 olacak \u015fekilde \u00f6zelle\u015ftirin, gerekirse I18n kullan\u0131n.<\/li>\n<li>Farkl\u0131 i\u015flemler i\u00e7in (olu\u015fturma, g\u00fcncelleme) farkl\u0131 validasyon ba\u011flamlar\u0131 kullanmaktan \u00e7ekinmeyin.<\/li>\n<li>Callback'leri dikkatli ve \u00f6l\u00e7\u00fcl\u00fc kullan\u0131n, karma\u015f\u0131k mant\u0131\u011f\u0131 servis objelerine ta\u015f\u0131y\u0131n.<\/li>\n<\/ul>\n<p>Bu prensiplere ba\u011fl\u0131 kalarak, Rails uygulamalar\u0131n\u0131z\u0131 daha g\u00fcvenli, daha dayan\u0131kl\u0131 ve bak\u0131m\u0131 daha kolay hale getirebilirsiniz. Geli\u015ftirme s\u00fcrecinizde validasyonlara yeterince zaman ay\u0131rmak, uzun vadede size b\u00fcy\u00fck faydalar sa\u011flayacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Rails'te validasyonlar nerede \u00e7al\u0131\u015f\u0131r?<\/dt>\n<dd>Rails validasyonlar\u0131 varsay\u0131lan olarak model seviyesinde, yani sunucu taraf\u0131nda \u00e7al\u0131\u015f\u0131r. Bir Active Record objesi <code>save<\/code>, <code>create<\/code> veya <code>update<\/code> gibi metodlarla veri taban\u0131na kaydedilmeye \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda otomatik olarak devreye girer. Bu, verilerin veri taban\u0131na tutars\u0131z veya hatal\u0131 bir \u015fekilde kaydedilmesini engeller.<\/dd>\n<dt>Client-side validasyonlar neden tek ba\u015f\u0131na yeterli de\u011fildir?<\/dt>\n<dd>Client-side validasyonlar (taray\u0131c\u0131 taraf\u0131nda \u00e7al\u0131\u015fanlar) sadece kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7indir. Bir kullan\u0131c\u0131 formu g\u00f6ndermeden \u00f6nce an\u0131nda geri bildirim sa\u011flar ve gereksiz sunucu isteklerini azalt\u0131r. Ancak, k\u00f6t\u00fc niyetli kullan\u0131c\u0131lar taray\u0131c\u0131daki JavaScript'i devre d\u0131\u015f\u0131 b\u0131rakabilir veya do\u011frudan API \u00e7a\u011fr\u0131lar\u0131 yaparak client-side validasyonlar\u0131 atlatabilir. Bu nedenle, g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in her zaman sunucu taraf\u0131 validasyonlara g\u00fcvenmek zorunludur.<\/dd>\n<dt>\u00d6zel bir validat\u00f6r s\u0131n\u0131f\u0131 ne zaman kullanmal\u0131y\u0131m?<\/dt>\n<dd>\u00d6zel bir validat\u00f6r s\u0131n\u0131f\u0131, ayn\u0131 do\u011frulama mant\u0131\u011f\u0131n\u0131 birden fazla modelde veya uygulaman\u0131z\u0131n farkl\u0131 yerlerinde tekrar kullanman\u0131z gerekti\u011finde idealdir. Kod tekrar\u0131n\u0131 \u00f6nler, DRY prensibine uygun hareket etmenizi sa\u011flar ve validasyon mant\u0131\u011f\u0131n\u0131z\u0131 daha mod\u00fcler ve y\u00f6netilebilir hale getirir. Karma\u015f\u0131k veya ni\u015f do\u011frulama kurallar\u0131 i\u00e7in de iyi bir se\u00e7enektir.<\/dd>\n<dt>Validasyon hatalar\u0131n\u0131 kullan\u0131c\u0131ya nas\u0131l g\u00f6steririm?<\/dt>\n<dd>Rails'te bir model objesinin validasyonlar\u0131 ba\u015far\u0131s\u0131z oldu\u011funda, <code>object.errors<\/code> hash'i hatalarla doldurulur. Bu hatalar\u0131 view katman\u0131nda (\u00f6rne\u011fin ERB, Haml, Slim \u015fablonlar\u0131nda) <code>object.errors.full_messages<\/code> ile veya belirli bir alan\u0131n hatalar\u0131n\u0131 <code>object.errors[:field_name]<\/code> ile alarak kullan\u0131c\u0131ya g\u00f6sterebilirsiniz. Genellikle, hatalar formun \u00fcst k\u0131sm\u0131nda veya ilgili form alan\u0131n\u0131n yan\u0131nda g\u00f6r\u00fcnt\u00fclenir.<\/dd>\n<dt>Validasyon callback'leri ile di\u011fer Active Record callback'leri aras\u0131ndaki fark nedir?<\/dt>\n<dd>Validasyon callback'leri (<code>before_validation<\/code>, <code>after_validation<\/code>), ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bir objenin ge\u00e7erlili\u011fi kontrol edilmeden \u00f6nce veya sonra tetiklenir. Di\u011fer Active Record callback'leri (<code>before_save<\/code>, <code>after_create<\/code>, <code>before_destroy<\/code> gibi) ise bir objenin ya\u015fam d\u00f6ng\u00fcs\u00fcndeki farkl\u0131 a\u015famalarda (kaydetme, olu\u015fturma, g\u00fcncelleme, silme) tetiklenir. Validasyon callback'leri, verinin ge\u00e7erlili\u011fini kontrol etmeden \u00f6nceki veya sonraki veriyi manip\u00fcle etmek veya ek kontrol yapmak i\u00e7in kullan\u0131l\u0131rken, di\u011ferleri daha \u00e7ok i\u015f mant\u0131\u011f\u0131 veya yan etkileri y\u00f6netmek i\u00e7in kullan\u0131l\u0131r.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1342],"tags":[],"class_list":{"0":"post-31012","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ai","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131<\/title>\n<meta name=\"description\" content=\"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131\" \/>\n<meta property=\"og:description\" content=\"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-04T14:01:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131\",\"datePublished\":\"2025-10-04T14:01:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\"},\"wordCount\":3302,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AI\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\",\"name\":\"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-04T14:01:50+00:00\",\"description\":\"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131","description":"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/","og_locale":"tr_TR","og_type":"article","og_title":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131","og_description":"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-04T14:01:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131","datePublished":"2025-10-04T14:01:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/"},"wordCount":3302,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AI"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/","url":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/","name":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-04T14:01:50+00:00","description":"Veri tutars\u0131zl\u0131\u011f\u0131 kabusuna son! G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131nda, kullan\u0131c\u0131dan al\u0131nan verilerin do\u011fru, eksiksiz ve beklenen formatta olmas\u0131, uygulaman\u0131n g\u00fcvenilirli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Peki, Rails d\u00fcnyas\u0131nda bu karma\u015f\u0131k veri do\u011frulama s\u00fcrecini nas\u0131l y\u00f6netiriz? Bu kapsaml\u0131 rehberde, Rails validasyonlar\u0131n\u0131n derinliklerine inecek, temel kavramlardan ileri d\u00fczey tekniklere kadar her \u015feyi ad\u0131m ad\u0131m \u00f6\u011frenecek ve uygulamalar\u0131n\u0131z\u0131 veri b\u00fct\u00fcnl\u00fc\u011f\u00fc konusunda zirveye ta\u015f\u0131yaca\u011f\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/rails-validasyonlari-hatasiz-uygulama-gelistirmenin-anahtari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Rails Validasyonlar\u0131: Hatas\u0131z Uygulama Geli\u015ftirmenin Anahtar\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31012","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31012"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31012\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31012"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31012"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31012"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}