{"id":33329,"date":"2025-11-01T16:41:22","date_gmt":"2025-11-01T13:41:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33329"},"modified":"2025-11-01T16:41:22","modified_gmt":"2025-11-01T13:41:22","slug":"ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/","title":{"rendered":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Ruby on Rails (genellikle &#8220;Rails&#8221; olarak an\u0131l\u0131r), web uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131 bir sunucu taraf\u0131 web uygulama \u00e7er\u00e7evesidir. Ruby programlama dili \u00fczerine in\u015fa edilmi\u015f olup, geli\u015ftiricilere h\u0131zl\u0131, verimli ve keyifli bir geli\u015ftirme deneyimi sunar. Rails, &#8220;Convention Over Configuration&#8221; (Yap\u0131land\u0131rma \u00dczerine Kural) ve &#8220;Don&#8217;t Repeat Yourself&#8221; (Kendini Tekrar Etme &#8211; DRY) prensiplerini benimseyerek, geli\u015ftiricilerin kod yazmaya daha az, i\u015f mant\u0131\u011f\u0131na odaklanmaya daha \u00e7ok zaman ay\u0131rmas\u0131na olanak tan\u0131r. Bu prensipler sayesinde, karma\u015f\u0131k web uygulamalar\u0131 bile k\u0131sa s\u00fcrede geli\u015ftirilebilir ve bak\u0131m\u0131 kolay hale gelir.<\/p>\n<p>Bu kapsaml\u0131 rehberde, s\u0131f\u0131rdan bir Ruby on Rails uygulamas\u0131 olu\u015fturma s\u00fcrecini ad\u0131m ad\u0131m inceleyece\u011fiz. Geli\u015ftirme ortam\u0131n\u0131n kurulumundan ba\u015flayarak, temel MVC (Model-View-Controller) mimarisini anlamaya, veritaban\u0131 etkile\u015fimleri kurmaya, CRUD (Create, Read, Update, Delete) i\u015flevselli\u011fi eklemeye ve hatta da\u011f\u0131t\u0131m\u0131n temel prensiplerine kadar bir\u00e7ok konuya de\u011finece\u011fiz. Amac\u0131m\u0131z, bu rehberi tamamlad\u0131\u011f\u0131n\u0131zda kendi Rails uygulaman\u0131z\u0131 in\u015fa edebilecek temel bilgi ve becerilere sahip olman\u0131z\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>\u00d6n Haz\u0131rl\u0131k ve Ortam Kurulumu<\/h3>\n<p>Bir Ruby on Rails uygulamas\u0131 geli\u015ftirmeye ba\u015flamadan \u00f6nce, gerekli yaz\u0131l\u0131mlar\u0131n sisteminize do\u011fru \u015fekilde kuruldu\u011fundan emin olmal\u0131s\u0131n\u0131z. Bu b\u00f6l\u00fcm, geli\u015ftirme ortam\u0131n\u0131z\u0131 haz\u0131rlaman\u0131z i\u00e7in gereken ad\u0131mlar\u0131 detayland\u0131racakt\u0131r.<\/p>\n<h4>Ruby Kurulumu<\/h4>\n<p>Rails, Ruby dili \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in ilk ad\u0131m Ruby&#8217;yi kurmakt\u0131r. Ruby&#8217;nin farkl\u0131 versiyonlar\u0131n\u0131 y\u00f6netmek i\u00e7in <code>rbenv<\/code> veya <code>RVM<\/code> gibi ara\u00e7lar kullanmak en iyi yakla\u015f\u0131md\u0131r. Bu ara\u00e7lar, farkl\u0131 projeler i\u00e7in farkl\u0131 Ruby versiyonlar\u0131n\u0131 kolayca de\u011fi\u015ftirmenize olanak tan\u0131r ve olas\u0131 ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler.<\/p>\n<p>*   <strong>macOS:<\/strong> Homebrew kullanarak <code>brew install rbenv ruby-build<\/code> komutuyla <code>rbenv<\/code>&#8216;i kurabilir, ard\u0131ndan <code>rbenv install 3.2.2<\/code> (veya istedi\u011finiz g\u00fcncel versiyon) ve <code>rbenv global 3.2.2<\/code> komutlar\u0131yla Ruby&#8217;yi y\u00fckleyebilirsiniz.<br \/>\n*   <strong>Linux:<\/strong> Genellikle da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n paket y\u00f6neticisi (apt, yum, dnf) ile <code>rbenv<\/code> ve <code>ruby-build<\/code> kurabilirsiniz. Ard\u0131ndan macOS&#8217;taki gibi Ruby&#8217;yi y\u00fckleyin.<br \/>\n*   <strong>Windows:<\/strong> Windows Subsystem for Linux (WSL2) kullan\u0131lmas\u0131 \u015fiddetle tavsiye edilir. WSL2 i\u00e7inde bir Linux da\u011f\u0131t\u0131m\u0131 (\u00f6rn. Ubuntu) kurarak, Linux ortam\u0131ndaki kurulum ad\u0131mlar\u0131n\u0131 takip edebilirsiniz. Do\u011frudan Windows&#8217;a Ruby kurmak da m\u00fcmk\u00fcnd\u00fcr ancak baz\u0131 gem&#8217;lerin derlenmesi sorunlara yol a\u00e7abilir.<\/p>\n<p>Kurulumdan sonra, terminalinizde <code>ruby -v<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak Ruby versiyonunu kontrol edin.<\/p>\n<h4>Veritaban\u0131 Kurulumu<\/h4>\n<p>Rails, varsay\u0131lan olarak <code>SQLite3<\/code> ile gelir ancak \u00fcretim ortamlar\u0131 i\u00e7in <code>PostgreSQL<\/code> veya <code>MySQL<\/code> gibi daha g\u00fc\u00e7l\u00fc veritabanlar\u0131 tercih edilir. Bu rehberde <code>PostgreSQL<\/code>&#8216;i temel alaca\u011f\u0131z, \u00e7\u00fcnk\u00fc Rails toplulu\u011funda yayg\u0131n olarak kullan\u0131l\u0131r ve bir\u00e7ok modern uygulaman\u0131n ihtiyac\u0131n\u0131 kar\u015f\u0131lar.<\/p>\n<p>*   <strong>macOS:<\/strong> Homebrew ile <code>brew install postgresql<\/code> komutuyla kolayca kurabilirsiniz.<br \/>\n*   <strong>Linux:<\/strong> Da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n paket y\u00f6neticisi ile <code>sudo apt install postgresql postgresql-contrib<\/code> (Ubuntu\/Debian) veya <code>sudo yum install postgresql-server<\/code> (CentOS\/Fedora) komutlar\u0131n\u0131 kullanabilirsiniz. Kurulumdan sonra veritaban\u0131 servisini ba\u015flatman\u0131z gerekebilir.<br \/>\n*   <strong>Windows (WSL2):<\/strong> WSL2 i\u00e7indeki Linux da\u011f\u0131t\u0131m\u0131nda Linux kurulum ad\u0131mlar\u0131n\u0131 takip edin.<\/p>\n<p>PostgreSQL&#8217;i kurduktan sonra, genellikle bir kullan\u0131c\u0131 ve veritaban\u0131 olu\u015fturman\u0131z gerekebilir. Rails, <code>database.yml<\/code> dosyas\u0131ndaki ayarlar ile bu i\u015flemleri otomatikle\u015ftirebilir.<\/p>\n<h4>Node.js ve Yarn Kurulumu<\/h4>\n<p>Rails 6 ve \u00fczeri versiyonlar, front-end varl\u0131klar\u0131n\u0131 (JavaScript k\u00fct\u00fcphaneleri, CSS \u00e7er\u00e7eveleri) y\u00f6netmek i\u00e7in Node.js ve Yarn&#8217;a (veya npm&#8217;e) ihtiya\u00e7 duyar. Node.js, JavaScript&#8217;i sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131rken, Yarn bir JavaScript paket y\u00f6neticisidir.<\/p>\n<p>*   <strong>T\u00fcm \u0130\u015fletim Sistemleri:<\/strong> Node.js&#8217;in resmi web sitesinden (nodejs.org) veya NVM (Node Version Manager) gibi bir ara\u00e7 kullanarak kurabilirsiniz. NVM, Ruby versiyon y\u00f6neticilerine benzer \u015fekilde farkl\u0131 Node.js versiyonlar\u0131n\u0131 y\u00f6netmenizi sa\u011flar.<br \/>\n*   Node.js kurulduktan sonra, <code>npm install -g yarn<\/code> komutuyla Yarn&#8217;\u0131 kurabilirsiniz.<br \/>\n*   Kurulumu <code>node -v<\/code> ve <code>yarn -v<\/code> komutlar\u0131yla do\u011frulay\u0131n.<\/p>\n<h4>Rails Gem Kurulumu<\/h4>\n<p>T\u00fcm ba\u011f\u0131ml\u0131l\u0131klar kurulduktan sonra, Rails gem&#8217;ini kurabiliriz. Gem, Ruby paketlerine verilen isimdir.<\/p>\n<p>*   Terminalinizde <code>gem install rails<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Bu komut, RubyGems.org&#8217;dan Rails&#8217;in en son kararl\u0131 versiyonunu indirip kuracakt\u0131r.<br \/>\n*   Kurulumdan sonra, <code>rails -v<\/code> komutuyla Rails versiyonunu kontrol edin.<\/p>\n<h3>Yeni Bir Rails Uygulamas\u0131 Olu\u015fturma<\/h3>\n<p>Geli\u015ftirme ortam\u0131n\u0131z haz\u0131r oldu\u011funa g\u00f6re, ilk Rails uygulaman\u0131z\u0131 olu\u015fturmaya ba\u015flayabiliriz.<\/p>\n<h4>Uygulama Olu\u015fturma Komutu<\/h4>\n<p>Yeni bir Rails uygulamas\u0131 olu\u015fturmak i\u00e7in <code>rails new<\/code> komutunu kullan\u0131r\u0131z. Bu komut, uygulaman\u0131n ismini ve baz\u0131 iste\u011fe ba\u011fl\u0131 parametreleri al\u0131r. \u00d6rne\u011fin, PostgreSQL kullanmak istedi\u011fimizi belirtmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">rails new my_first_app --database=postgresql\ncd my_first_app<\/code><\/pre>\n<p>Bu komut:<br \/>\n*   <code>my_first_app<\/code> ad\u0131nda yeni bir dizin olu\u015fturur.<br \/>\n*   Bu dizin i\u00e7inde Rails&#8217;in standart dosya ve dizin yap\u0131s\u0131n\u0131 kurar.<br \/>\n*   Gerekli gem&#8217;leri i\u00e7eren bir <code>Gemfile<\/code> olu\u015fturur.<br \/>\n*   <code>--database=postgresql<\/code> parametresi sayesinde, <code>config\/database.yml<\/code> dosyas\u0131n\u0131 PostgreSQL&#8217;e g\u00f6re yap\u0131land\u0131r\u0131r.<br \/>\n*   Komutun sonunda <code>bundle install<\/code> \u00e7al\u0131\u015ft\u0131r\u0131larak <code>Gemfile<\/code>&#8216;da belirtilen t\u00fcm ba\u011f\u0131ml\u0131l\u0131k gem&#8217;leri y\u00fcklenir.<\/p>\n<h4>Proje Yap\u0131s\u0131na Genel Bak\u0131\u015f<\/h4>\n<p><code>my_first_app<\/code> dizinine girdi\u011finizde, Rails&#8217;in d\u00fczenli ve tahmin edilebilir dosya yap\u0131s\u0131n\u0131 g\u00f6receksiniz. En \u00f6nemli dizinlerden baz\u0131lar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <code>app\/<\/code>: Uygulaman\u0131z\u0131n ana kodunu i\u00e7erir (Models, Views, Controllers, Helpers, Assets vb.).<br \/>\n*   <code>bin\/<\/code>: Rails komut dosyalar\u0131n\u0131 i\u00e7erir (\u00f6rn. <code>rails<\/code>, <code>rake<\/code>).<br \/>\n*   <code>config\/<\/code>: Uygulaman\u0131z\u0131n yap\u0131land\u0131rma dosyalar\u0131n\u0131 i\u00e7erir (routes, database, environment settings).<br \/>\n*   <code>db\/<\/code>: Veritaban\u0131 \u015femas\u0131 ve migration dosyalar\u0131n\u0131 i\u00e7erir.<br \/>\n*   <code>lib\/<\/code>: Uygulaman\u0131za \u00f6zel mod\u00fcller veya k\u00fct\u00fcphaneler i\u00e7in.<br \/>\n*   <code>public\/<\/code>: Statik dosyalar (HTML, CSS, JavaScript) ve hata sayfalar\u0131.<br \/>\n*   <code>test\/<\/code>: Uygulaman\u0131z\u0131n testlerini i\u00e7erir.<br \/>\n*   <code>vendor\/<\/code>: \u00dc\u00e7\u00fcnc\u00fc taraf kodlar\u0131 i\u00e7in.<br \/>\n*   <code>Gemfile<\/code>: Uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (gem&#8217;ler) listeler.<\/p>\n<p>Bu yap\u0131, &#8220;Convention Over Configuration&#8221; prensibinin bir sonucudur; geli\u015ftiricilerin \u00e7o\u011fu \u015feyi ba\u015ftan yap\u0131land\u0131rmak yerine, Rails&#8217;in \u00f6nerdi\u011fi yola uymas\u0131 beklenir.<\/p>\n<h4>Veritaban\u0131 Yap\u0131land\u0131rmas\u0131<\/h4>\n<p><code>config\/database.yml<\/code> dosyas\u0131, uygulaman\u0131z\u0131n farkl\u0131 ortamlar (development, test, production) i\u00e7in veritaban\u0131 ba\u011flant\u0131 ayarlar\u0131n\u0131 i\u00e7erir. <code>rails new<\/code> komutunu <code>--database=postgresql<\/code> ile \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z i\u00e7in bu dosya zaten PostgreSQL&#8217;e g\u00f6re yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Uygulaman\u0131z\u0131n veritabanlar\u0131n\u0131 olu\u015fturmak i\u00e7in a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">rails db:create<\/code><\/pre>\n<p>Bu komut, <code>development<\/code> ve <code>test<\/code> ortamlar\u0131 i\u00e7in veritabanlar\u0131n\u0131 olu\u015fturacakt\u0131r. Hen\u00fcz bir tablo olu\u015fturmad\u0131\u011f\u0131m\u0131z i\u00e7in <code>rails db:migrate<\/code> komutu \u015fu an i\u00e7in herhangi bir i\u015flem yapmayacakt\u0131r, ancak veritaban\u0131 \u015femas\u0131n\u0131 olu\u015fturmak i\u00e7in ileride kullanaca\u011f\u0131z.<\/p>\n<h3>Temel MVC Mimarisi ve \u0130lk Ad\u0131mlar<\/h3>\n<p>Rails, Model-View-Controller (MVC) mimarisini benimser. Bu mimari, bir uygulaman\u0131n farkl\u0131 katmanlar\u0131n\u0131 ay\u0131rarak kodun daha d\u00fczenli, okunabilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Model-View-Controller (MVC) Nedir?<\/h4>\n<p>*   <strong>Model:<\/strong> Uygulaman\u0131z\u0131n veri katman\u0131n\u0131 ve i\u015f mant\u0131\u011f\u0131n\u0131 temsil eder. Veritaban\u0131yla etkile\u015fime girer, verileri do\u011frular, kaydeder ve al\u0131r. Rails&#8217;te modeller Active Record ile temsil edilir.<br \/>\n*   <strong>View:<\/strong> Kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc temsil eder. Modellerden gelen verileri alarak kullan\u0131c\u0131ya g\u00f6sterilecek HTML (veya di\u011fer formatlar) olu\u015fturur. Rails&#8217;te View&#8217;lar genellikle ERB (Embedded Ruby) \u015fablonlar\u0131d\u0131r.<br \/>\n*   <strong>Controller:<\/strong> Model ve View aras\u0131ndaki arac\u0131d\u0131r. Kullan\u0131c\u0131n\u0131n isteklerini (HTTP request) al\u0131r, Model&#8217;den veri ister, bu verileri i\u015fler ve View&#8217;a g\u00f6ndererek bir yan\u0131t (HTTP response) olu\u015fturur.<\/p>\n<h4>Routing (Y\u00f6nlendirme)<\/h4>\n<p>Rails&#8217;te bir web iste\u011fi geldi\u011finde, bu iste\u011fin hangi Controller&#8217;daki hangi metoda y\u00f6nlendirilece\u011fini <code>config\/routes.rb<\/code> dosyas\u0131 belirler. Bu dosya, uygulaman\u0131z\u0131n &#8220;trafik polisi&#8221; gibidir.<\/p>\n<p><code>config\/routes.rb<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve basit bir ana sayfa rotas\u0131 tan\u0131mlayal\u0131m:<\/p>\n<pre><code class=\"language-ruby\"># config\/routes.rb\nRails.application.routes.draw do\n  root 'pages#home' # Uygulaman\u0131n k\u00f6k dizinine gelen istekleri PagesController'daki home metoduna y\u00f6nlendirir.\nend<\/code><\/pre>\n<p>Bu <code>root<\/code> rotas\u0131, taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000\/<\/code> adresine gitti\u011finizde <code>PagesController<\/code> i\u00e7indeki <code>home<\/code> ad\u0131nda bir metodu \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 s\u00f6yler.<\/p>\n<h4>Controller Olu\u015fturma<\/h4>\n<p>\u015eimdi <code>PagesController<\/code>&#8216;\u0131 olu\u015ftural\u0131m. Rails generator&#8217;\u0131 kullanarak h\u0131zl\u0131ca bir controller olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-bash\">rails generate controller Pages home about<\/code><\/pre>\n<p>Bu komut:<br \/>\n*   <code>app\/controllers\/pages_controller.rb<\/code> dosyas\u0131n\u0131 olu\u015fturur.<br \/>\n*   <code>home<\/code> ve <code>about<\/code> ad\u0131nda iki bo\u015f metod ekler.<br \/>\n*   <code>app\/views\/pages\/home.html.erb<\/code> ve <code>app\/views\/pages\/about.html.erb<\/code> ad\u0131nda iki view dosyas\u0131 olu\u015fturur.<\/p>\n<p><code>pages_controller.rb<\/code> dosyas\u0131 \u015f\u00f6yle g\u00f6r\u00fcnecektir:<\/p>\n<pre><code class=\"language-ruby\"># app\/controllers\/pages_controller.rb\nclass PagesController < ApplicationController\n  def home\n    # Burada ana sayfa i\u00e7in gerekli verileri haz\u0131rlayabiliriz.\n  end\n\n  def about\n    # Burada \"Hakk\u0131m\u0131zda\" sayfas\u0131 i\u00e7in gerekli verileri haz\u0131rlayabiliriz.\n  end\nend<\/code><\/pre>\n<h4>View Olu\u015fturma<\/h4>\n<p>Controller'lar verileri haz\u0131rlar, View'lar ise bu verileri kullanarak HTML \u00e7\u0131kt\u0131s\u0131n\u0131 olu\u015fturur. <code>rails generate controller<\/code> komutuyla olu\u015fturulan view dosyalar\u0131n\u0131 d\u00fczenleyelim.<\/p>\n<p><code>app\/views\/pages\/home.html.erb<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve i\u00e7ine basit bir HTML i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-html\">+erb\n<!-- app\/views\/pages\/home.html.erb -->\n\n<p>Bu benim ilk Rails uygulamam\u0131n ana sayfas\u0131.<\/p>\n<%= link_to 'Hakk\u0131m\u0131zda', pages_about_path %><\/code><\/pre>\n<p><code>app\/views\/pages\/about.html.erb<\/code> dosyas\u0131na da benzer bir i\u00e7erik ekleyin:<\/p>\n<pre><code class=\"language-html\">+erb\n<!-- app\/views\/pages\/about.html.erb -->\n\n<p>Bu uygulama Ruby on Rails ile geli\u015ftirilmi\u015ftir.<\/p>\n<%= link_to 'Ana Sayfa', root_path %><\/code><\/pre>\n<p><code><%= ... %><\/code> etiketleri, Ruby kodunun \u00e7\u0131kt\u0131s\u0131n\u0131 HTML i\u00e7ine yerle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. <code>link_to<\/code> ise Rails'in bir helper metodudur ve belirtilen rota i\u00e7in bir HTML ba\u011flant\u0131s\u0131 olu\u015fturur. <code>root_path<\/code> ve <code>pages_about_path<\/code> ise Rails'in otomatik olarak olu\u015fturdu\u011fu rota helper'lar\u0131d\u0131r.<\/p>\n<p>Uygulaman\u0131z\u0131 ba\u015flatmak i\u00e7in terminalde <code>rails server<\/code> (veya <code>rails s<\/code>) komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000\/<\/code> adresine giderek ana sayfan\u0131z\u0131 g\u00f6rebilirsiniz.<\/p>\n<h3>Veritaban\u0131 ve Model Katman\u0131<\/h3>\n<p>Web uygulamalar\u0131n\u0131n \u00e7o\u011fu, verileri kal\u0131c\u0131 olarak depolamak i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. Rails'te bu i\u015flem, Active Record ad\u0131 verilen ORM (Object-Relational Mapping) arac\u0131 sayesinde kolayla\u015f\u0131r. Active Record, Ruby nesneleri ile veritaban\u0131 tablolar\u0131 aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<h4>Model Olu\u015fturma<\/h4>\n<p>Bir blog uygulamas\u0131 yapt\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m ve g\u00f6nderileri (posts) depolamak isteyelim. Bir <code>Post<\/code> modeli olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">rails generate model Post title:string content:text<\/code><\/pre>\n<p>Bu komut iki \u00f6nemli \u015fey yapar:<br \/>\n1.  <code>app\/models\/post.rb<\/code> ad\u0131nda bir model dosyas\u0131 olu\u015fturur.<br \/>\n2.  <code>db\/migrate\/YYYYMMDDHHMMSS_create_posts.rb<\/code> ad\u0131nda bir migration dosyas\u0131 olu\u015fturur. Migration dosyalar\u0131, veritaban\u0131 \u015femas\u0131ndaki de\u011fi\u015fiklikleri (tablo olu\u015fturma, s\u00fctun ekleme vb.) y\u00f6netmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><code>post.rb<\/code> dosyas\u0131 ba\u015flang\u0131\u00e7ta bo\u015f olacakt\u0131r, ancak Active Record sayesinde veritaban\u0131 tablosuyla etkile\u015fim kurma yetene\u011fine sahiptir.<\/p>\n<p><code>create_posts.rb<\/code> migration dosyas\u0131 \u015f\u00f6yle g\u00f6r\u00fcnecektir:<\/p>\n<pre><code class=\"language-ruby\"># db\/migrate\/YYYYMMDDHHMMSS_create_posts.rb\nclass CreatePosts < ActiveRecord::Migration[7.0] # Rails versiyonuna g\u00f6re de\u011fi\u015febilir\n  def change\n    create_table :posts do |t|\n      t.string :title\n      t.text :content\n\n      t.timestamps # created_at ve updated_at s\u00fctunlar\u0131n\u0131 otomatik ekler\n    end\n  end\nend<\/code><\/pre>\n<p>Bu migration dosyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak veritaban\u0131m\u0131zda <code>posts<\/code> tablosunu olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">rails db:migrate<\/code><\/pre>\n<p>Art\u0131k veritaban\u0131m\u0131zda <code>posts<\/code> ad\u0131nda, <code>id<\/code>, <code>title<\/code>, <code>content<\/code>, <code>created_at<\/code> ve <code>updated_at<\/code> s\u00fctunlar\u0131na sahip bir tablo var.<\/p>\n<h4>Active Record<\/h4>\n<p>Active Record, veritaban\u0131 etkile\u015fimlerini Ruby nesneleri \u00fczerinden yapmam\u0131z\u0131 sa\u011flar.<\/p>\n<p>*   <strong>Veri Olu\u015fturma (Create):<\/strong><\/p>\n<pre><code class=\"language-ruby\">post = Post.new(title: \"\u0130lk G\u00f6nderi\", content: \"Bu benim ilk blog g\u00f6nderim.\")\n    post.save # Veritaban\u0131na kaydeder\n    # Veya daha k\u0131sas\u0131:\n    Post.create(title: \"\u0130kinci G\u00f6nderi\", content: \"Bu da ikinci g\u00f6nderi.\")<\/code><\/pre>\n<p>*   <strong>Veri Okuma (Read):<\/strong><\/p>\n<pre><code class=\"language-ruby\">all_posts = Post.all # T\u00fcm g\u00f6nderileri al\u0131r\n    first_post = Post.first # \u0130lk g\u00f6nderiyi al\u0131r\n    specific_post = Post.find(1) # ID'si 1 olan g\u00f6nderiyi al\u0131r\n    search_posts = Post.where(\"title LIKE ?\", \"%ilk%\") # Ba\u015fl\u0131\u011f\u0131nda \"ilk\" ge\u00e7en g\u00f6nderileri bulur<\/code><\/pre>\n<p>*   <strong>Veri G\u00fcncelleme (Update):<\/strong><\/p>\n<pre><code class=\"language-ruby\">post = Post.find(1)\n    post.title = \"G\u00fcncellenmi\u015f Ba\u015fl\u0131k\"\n    post.save # De\u011fi\u015fiklikleri kaydeder\n    # Veya daha k\u0131sas\u0131:\n    post.update(content: \"G\u00fcncellenmi\u015f i\u00e7erik.\")<\/code><\/pre>\n<p>*   <strong>Veri Silme (Delete):<\/strong><\/p>\n<pre><code class=\"language-ruby\">post = Post.find(1)\n    post.destroy # G\u00f6nderiyi veritaban\u0131ndan siler<\/code><\/pre>\n<h4>Validasyonlar<\/h4>\n<p>Modeller, veritaban\u0131na kaydedilmeden \u00f6nce verilerin do\u011frulu\u011funu sa\u011flamak i\u00e7in validasyonlara sahip olabilir. \u00d6rne\u011fin, bir g\u00f6nderinin ba\u015fl\u0131\u011f\u0131n\u0131n bo\u015f olmamas\u0131n\u0131 isteyebiliriz:<\/p>\n<pre><code class=\"language-ruby\"># app\/models\/post.rb\nclass Post < ApplicationRecord\n  validates :title, presence: true, length: { minimum: 5 }\n  validates :content, presence: true\nend<\/code><\/pre>\n<p>\u015eimdi bir <code>Post<\/code> objesi olu\u015fturup kaydetmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zda, e\u011fer ba\u015fl\u0131k bo\u015fsa <code>post.save<\/code> metodu <code>false<\/code> d\u00f6necek ve <code>post.errors.full_messages<\/code> ile hata mesajlar\u0131na eri\u015febilece\u011fiz.<\/p>\n<h4>\u0130li\u015fkiler<\/h4>\n<p>Rails'te modeller aras\u0131nda ili\u015fkiler tan\u0131mlamak \u00e7ok kolayd\u0131r. \u00d6rne\u011fin, bir <code>User<\/code> modelimiz olsayd\u0131 ve bir kullan\u0131c\u0131n\u0131n birden fazla g\u00f6nderi yazabilece\u011fini belirtmek isteseydik:<\/p>\n<pre><code class=\"language-ruby\"># app\/models\/user.rb\nclass User < ApplicationRecord\n  has_many :posts # Bir kullan\u0131c\u0131n\u0131n birden fazla g\u00f6nderisi olabilir\nend\n\n<h2>app\/models\/post.rb<\/h2>\nclass Post < ApplicationRecord\n  belongs_to :user # Bir g\u00f6nderi bir kullan\u0131c\u0131ya aittir\nend<\/code><\/pre>\n<p>Bu ili\u015fkileri kurmak i\u00e7in <code>posts<\/code> tablosuna <code>user_id<\/code> ad\u0131nda bir foreign key eklememiz gerekir (yeni bir migration ile).<\/p>\n<h4>Seed Verileri<\/h4>\n<p>Geli\u015ftirme ortam\u0131n\u0131z i\u00e7in veya testler i\u00e7in \u00f6rnek veriler olu\u015fturmak isteyebilirsiniz. <code>db\/seeds.rb<\/code> dosyas\u0131 bunun i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-ruby\"># db\/seeds.rb\nPost.destroy_all # Mevcut t\u00fcm g\u00f6nderileri sil (iste\u011fe ba\u011fl\u0131)\n\nPost.create(title: \"Seed ile Olu\u015fturulan \u0130lk G\u00f6nderi\", content: \"Bu bir seed verisidir.\")\nPost.create(title: \"\u0130kinci Seed G\u00f6nderisi\", content: \"Daha fazla i\u00e7erik.\")<\/code><\/pre>\n<p>Bu dosyay\u0131 \u00e7al\u0131\u015ft\u0131rarak \u00f6rnek verileri veritaban\u0131na ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">rails db:seed<\/code><\/pre>\n<h3>CRUD \u0130\u015flevselli\u011fi Geli\u015ftirme<\/h3>\n<p>Art\u0131k bir <code>Post<\/code> modelimiz oldu\u011funa ve temel veritaban\u0131 etkile\u015fimlerini anlad\u0131\u011f\u0131m\u0131za g\u00f6re, bir blog uygulamas\u0131n\u0131n temelini olu\u015fturan CRUD (Create, Read, Update, Delete) i\u015flevselli\u011fini Rails'in sundu\u011fu ara\u00e7larla nas\u0131l geli\u015ftirece\u011fimizi g\u00f6relim.<\/p>\n<h4>Resourceful Routing<\/h4>\n<p>Rails, RESTful mimariye uygun olarak kaynak tabanl\u0131 (resourceful) y\u00f6nlendirmeler sa\u011flar. Bir kaynak i\u00e7in (\u00f6rne\u011fin <code>posts<\/code>) t\u00fcm standart CRUD i\u015flemlerini kapsayan rotalar\u0131 tek bir sat\u0131rda tan\u0131mlayabiliriz:<\/p>\n<pre><code class=\"language-ruby\"># config\/routes.rb\nRails.application.routes.draw do\n  root 'pages#home'\n  resources :posts # Bu tek sat\u0131r, 7 farkl\u0131 rota olu\u015fturur!\nend<\/code><\/pre>\n<p><code>resources :posts<\/code> komutu a\u015fa\u011f\u0131daki rotalar\u0131 otomatik olarak olu\u015fturur:<\/p>\n<p>| HTTP Metodu | Yol                 | Controller#Action | Ama\u00e7                               | Rota Helper         |<br \/>\n| :---------- | :------------------ | :---------------- | :--------------------------------- | :------------------ |<br \/>\n| GET         | <code>\/posts<\/code>            | <code>posts#index<\/code>     | T\u00fcm g\u00f6nderileri listele            | <code>posts_path<\/code>        |<br \/>\n| GET         | <code>\/posts\/:id<\/code>        | <code>posts#show<\/code>      | Belirli bir g\u00f6nderiyi g\u00f6ster       | <code>post_path(post)<\/code>   |<br \/>\n| GET         | <code>\/posts\/new<\/code>        | <code>posts#new<\/code>       | Yeni bir g\u00f6nderi olu\u015fturma formu   | <code>new_post_path<\/code>     |<br \/>\n| POST        | <code>\/posts<\/code>            | <code>posts#create<\/code>    | Yeni g\u00f6nderiyi kaydet              | <code>posts_path<\/code>        |<br \/>\n| GET         | <code>\/posts\/:id\/edit<\/code>   | <code>posts#edit<\/code>      | Mevcut g\u00f6nderiyi d\u00fczenleme formu   | <code>edit_post_path(post)<\/code> |<br \/>\n| PATCH\/PUT   | <code>\/posts\/:id<\/code>        | <code>posts#update<\/code>    | Mevcut g\u00f6nderiyi g\u00fcncelle          | <code>post_path(post)<\/code>   |<br \/>\n| DELETE      | <code>\/posts\/:id<\/code>        | <code>posts#destroy<\/code>   | Belirli bir g\u00f6nderiyi sil          | <code>post_path(post)<\/code>   |<\/p>\n<p>Bu rotalar\u0131 g\u00f6rmek i\u00e7in <code>rails routes<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h4>Controller Actions<\/h4>\n<p>Yukar\u0131daki rotalara kar\u015f\u0131l\u0131k gelen <code>PostsController<\/code>'\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">rails generate controller Posts<\/code><\/pre>\n<p>\u015eimdi <code>app\/controllers\/posts_controller.rb<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek CRUD aksiyonlar\u0131n\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-ruby\"># app\/controllers\/posts_controller.rb\nclass PostsController < ApplicationController\n  before_action :set_post, only: [:show, :edit, :update, :destroy]\n\n  # GET \/posts\n  def index\n    @posts = Post.all\n  end\n\n  # GET \/posts\/:id\n  def show\n    # @post, set_post metodunda ayarland\u0131\n  end\n\n  # GET \/posts\/new\n  def new\n    @post = Post.new\n  end\n\n  # POST \/posts\n  def create\n    @post = Post.new(post_params)\n    if @post.save\n      redirect_to @post, notice: 'G\u00f6nderi ba\u015far\u0131yla olu\u015fturuldu.'\n    else\n      render :new, status: :unprocessable_entity\n    end\n  end\n\n  # GET \/posts\/:id\/edit\n  def edit\n    # @post, set_post metodunda ayarland\u0131\n  end\n\n  # PATCH\/PUT \/posts\/:id\n  def update\n    if @post.update(post_params)\n      redirect_to @post, notice: 'G\u00f6nderi ba\u015far\u0131yla g\u00fcncellendi.'\n    else\n      render :edit, status: :unprocessable_entity\n    end\n  end\n\n  # DELETE \/posts\/:id\n  def destroy\n    @post.destroy\n    redirect_to posts_url, notice: 'G\u00f6nderi ba\u015far\u0131yla silindi.'\n  end\n\n  private\n\n  # Tekrar eden kodu \u00f6nlemek i\u00e7in DRY prensibi\n  def set_post\n    @post = Post.find(params[:id])\n  end\n\n  # G\u00fcvenlik i\u00e7in strong parameters kullan\u0131l\u0131r\n  def post_params\n    params.require(:post).permit(:title, :content)\n  end\nend<\/code><\/pre>\n<p>Yukar\u0131daki kodda:<br \/>\n*   <code>before_action :set_post, only: [...]<\/code>: Belirtilen aksiyonlar \u00e7al\u0131\u015fmadan \u00f6nce <code>set_post<\/code> metodunu \u00e7al\u0131\u015ft\u0131r\u0131r ve <code>@post<\/code> de\u011fi\u015fkenini ayarlar. Bu, kod tekrar\u0131n\u0131 \u00f6nler.<br \/>\n*   <code>post_params<\/code>: G\u00fcvenlik i\u00e7in \"strong parameters\" ad\u0131 verilen bir Rails \u00f6zelli\u011fidir. Bu, sadece izin verilen parametrelerin (burada <code>title<\/code> ve <code>content<\/code>) controller'a ula\u015fmas\u0131n\u0131 sa\u011flar ve Mass Assignment zafiyetini \u00f6nler.<br \/>\n*   <code>redirect_to<\/code>: \u0130\u015flem ba\u015far\u0131l\u0131 oldu\u011funda kullan\u0131c\u0131y\u0131 ba\u015fka bir sayfaya y\u00f6nlendirir.<br \/>\n*   <code>render<\/code>: Bir view dosyas\u0131n\u0131 do\u011frudan render eder, taray\u0131c\u0131ya yeni bir HTTP iste\u011fi g\u00f6ndermez.<br \/>\n*   <code>status: :unprocessable_entity<\/code>: HTTP 422 durum kodunu g\u00f6nderir, bu da iste\u011fin anla\u015f\u0131ld\u0131\u011f\u0131 ancak i\u015flenemedi\u011fi anlam\u0131na gelir (\u00f6rn. validasyon hatalar\u0131).<\/p>\n<h4>Form Olu\u015fturma<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n yeni g\u00f6nderi olu\u015fturmas\u0131 ve mevcut g\u00f6nderileri d\u00fczenlemesi i\u00e7in formlara ihtiyac\u0131m\u0131z var. Rails, bu formlar\u0131 olu\u015fturmak i\u00e7in <code>form_with<\/code> helper'\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6ncelikle <code>app\/views\/posts<\/code> dizini alt\u0131nda <code>index.html.erb<\/code> (t\u00fcm g\u00f6nderileri listelemek i\u00e7in), <code>show.html.erb<\/code> (tek bir g\u00f6nderiyi g\u00f6stermek i\u00e7in), <code>new.html.erb<\/code> (yeni g\u00f6nderi formu i\u00e7in) ve <code>edit.html.erb<\/code> (g\u00f6nderiyi d\u00fczenleme formu i\u00e7in) dosyalar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<p><strong><code>app\/views\/posts\/index.html.erb<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">+erb\n\n<%= link_to 'Yeni G\u00f6nderi Olu\u015ftur', new_post_path %>\n\n<% if notice %>\n  <p style=\"color: green\"><%= notice %><\/p>\n<% end %>\n\n<% @posts.each do |post| %>\n  <div>\n    <h2><%= link_to post.title, post_path(post) %><\/h2>\n    <p><%= post.content.truncate(150) %><\/p>\n    <%= link_to 'D\u00fczenle', edit_post_path(post) %> |\n    <%= link_to 'Sil', post_path(post), data: { turbo_method: :delete, turbo_confirm: 'Emin misiniz?' } %>\n    <hr>\n  <\/div>\n<% end %><\/code><\/pre>\n<p><strong><code>app\/views\/posts\/show.html.erb<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">+erb\n\n<p><%= @post.content %><\/p>\n\n<%= link_to 'D\u00fczenle', edit_post_path(@post) %> |\n<%= link_to 'Geri', posts_path %><\/code><\/pre>\n<p><strong><code>app\/views\/posts\/new.html.erb<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">+erb\n\n<%= render 'form', post: @post %>\n<%= link_to 'Geri', posts_path %><\/code><\/pre>\n<p><strong><code>app\/views\/posts\/edit.html.erb<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">+erb\n\n<%= render 'form', post: @post %>\n<%= link_to 'G\u00f6ster', post_path(@post) %> |\n<%= link_to 'Geri', posts_path %><\/code><\/pre>\n<h4>Partial'lar<\/h4>\n<p><code>new.html.erb<\/code> ve <code>edit.html.erb<\/code> dosyalar\u0131nda form kodunun tekrar etti\u011fini fark edeceksiniz. Rails, bu t\u00fcr tekrar eden kod bloklar\u0131n\u0131 <code>partial<\/code> ad\u0131 verilen k\u00fc\u00e7\u00fck \u015fablonlara ay\u0131rmam\u0131z\u0131 sa\u011flar. <code>_form.html.erb<\/code> ad\u0131nda bir partial olu\u015ftural\u0131m:<\/p>\n<p><strong><code>app\/views\/posts\/_form.html.erb<\/code>:<\/strong><\/p>\n<pre><code class=\"language-html\">+erb\n<%= form_with(model: post) do |form| %>\n  <% if post.errors.any? %>\n    <div id=\"error_explanation\" style=\"color: red;\">\n      <h2><%= pluralize(post.errors.count, \"hata\") %> bu g\u00f6nderinin kaydedilmesini engelledi:<\/h2>\n      <ul>\n        <% post.errors.full_messages.each do |message| %>\n          <li><%= message %><\/li>\n        <% end %>\n      <\/ul>\n    <\/div>\n  <% end %>\n\n  <div>\n    <%= form.label :title, \"Ba\u015fl\u0131k\" %>\n    <%= form.text_field :title %>\n  <\/div>\n\n  <div>\n    <%= form.label :content, \"\u0130\u00e7erik\" %>\n    <%= form.text_area :content %>\n  <\/div>\n\n  <div>\n    <%= form.submit \"Kaydet\" %>\n  <\/div>\n<% end %><\/code><\/pre>\n<p>Bu partial'\u0131 di\u011fer view dosyalar\u0131nda <code><%= render &#039;form&#039;, post: @post %><\/code> \u015feklinde \u00e7a\u011f\u0131rabiliriz. <code>form_with(model: post)<\/code> helper'\u0131, <code>post<\/code> objesinin yeni mi yoksa mevcut bir obje mi oldu\u011funa g\u00f6re otomatik olarak do\u011fru HTTP metodunu (POST veya PATCH) ve URL'yi ayarlar. Ayr\u0131ca validasyon hatalar\u0131n\u0131 da otomatik olarak i\u015fler ve g\u00f6sterir.<\/p>\n<p>Uygulaman\u0131z\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131n (<code>rails s<\/code>) ve <code>http:\/\/localhost:3000\/posts<\/code> adresine giderek blog uygulaman\u0131z\u0131n CRUD i\u015flevselli\u011fini test edin.<\/p>\n<h3>Kullan\u0131c\u0131 Aray\u00fcz\u00fc ve Varl\u0131k Y\u00f6netimi<\/h3>\n<p>Modern web uygulamalar\u0131 sadece i\u015flevsellikten ibaret de\u011fildir; kullan\u0131c\u0131 deneyimi de kritik \u00f6neme sahiptir. Rails, CSS ve JavaScript gibi front-end varl\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc mekanizmalar sunar.<\/p>\n<h4>CSS ve JavaScript<\/h4>\n<p>Rails'in farkl\u0131 versiyonlar\u0131, front-end varl\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in farkl\u0131 yakla\u015f\u0131mlar benimsemi\u015ftir:<\/p>\n<p>*   <strong>Asset Pipeline (Rails 6 \u00f6ncesi):<\/strong> <code>Sprockets<\/code> gem'i arac\u0131l\u0131\u011f\u0131yla CSS (Sass\/SCSS), JavaScript (CoffeeScript) ve resim dosyalar\u0131n\u0131 \u00f6n derler, s\u0131k\u0131\u015ft\u0131r\u0131r ve birle\u015ftirir. <code>app\/assets<\/code> dizini alt\u0131nda dosyalar\u0131n\u0131z\u0131 tutars\u0131n\u0131z.<br \/>\n*   <strong>Webpacker (Rails 6):<\/strong> Modern JavaScript ara\u00e7 zincirlerini (Webpack) Rails'e entegre etti. <code>app\/javascript<\/code> dizini alt\u0131nda React, Vue, Angular gibi k\u00fct\u00fcphaneleri kullanman\u0131z\u0131 kolayla\u015ft\u0131rd\u0131.<br \/>\n*   <strong>Importmap (Rails 7+):<\/strong> Webpacker'\u0131n yerini ald\u0131 ve daha hafif bir yakla\u015f\u0131mla, taray\u0131c\u0131da do\u011frudan ES mod\u00fcllerini kullanmay\u0131 te\u015fvik eder. Genellikle <code>app\/javascript<\/code> dizini alt\u0131nda JavaScript dosyalar\u0131n\u0131z\u0131 tutars\u0131n\u0131z ve <code>config\/importmap.rb<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netirsiniz.<\/p>\n<p><strong>\u00d6rnek: Tailwind CSS Entegrasyonu (Rails 7 ile Importmap)<\/strong><br \/>\nRails 7, yeni bir uygulama olu\u015ftururken Tailwind CSS'i kolayca entegre etmenize olanak tan\u0131r:<\/p>\n<pre><code class=\"language-bash\">rails new my_app --css=tailwind<\/code><\/pre>\n<p>E\u011fer mevcut bir uygulamaya eklemek isterseniz:<\/p>\n<pre><code class=\"language-bash\">bin\/bundle add tailwindcss-rails\nbin\/rails tailwindcss:install<\/code><\/pre>\n<p>Bu komutlar, Tailwind CSS'i uygulaman\u0131za kurar ve <code>app\/assets\/stylesheets\/application.tailwind.css<\/code> dosyas\u0131n\u0131 olu\u015fturur. Buraya \u00f6zel Tailwind s\u0131n\u0131flar\u0131n\u0131z\u0131 veya <code>@apply<\/code> direktiflerinizi ekleyebilirsiniz.<\/p>\n<p><strong>JavaScript Mod\u00fclleri:<\/strong><br \/>\nImportmap ile bir JavaScript mod\u00fcl\u00fc eklemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">bin\/importmap pin chartkick<\/code><\/pre>\n<p>Bu, <code>config\/importmap.rb<\/code> dosyas\u0131na <code>pin \"chartkick\"<\/code> sat\u0131r\u0131n\u0131 ekler. Ard\u0131ndan JavaScript dosyan\u0131zda <code>import Chartkick from \"chartkick\"<\/code> \u015feklinde kullanabilirsiniz.<\/p>\n<h4>Helper Metotlar\u0131<\/h4>\n<p>Rails helper'lar\u0131, view'lerdeki karma\u015f\u0131k mant\u0131\u011f\u0131 basitle\u015ftirmek ve kod tekrar\u0131n\u0131 azaltmak i\u00e7in kullan\u0131l\u0131r. <code>app\/helpers<\/code> dizini alt\u0131nda tan\u0131mlan\u0131r. \u00d6rne\u011fin, bir g\u00f6nderinin olu\u015fturulma tarihini g\u00fczel bir formatta g\u00f6stermek i\u00e7in bir helper yazabiliriz:<\/p>\n<pre><code class=\"language-ruby\"># app\/helpers\/posts_helper.rb\nmodule PostsHelper\n  def formatted_date(date)\n    date.strftime(\"%d %B %Y, %H:%M\")\n  end\nend<\/code><\/pre>\n<p>Ard\u0131ndan view dosyan\u0131zda <code><%= formatted_date(@post.created_at) %><\/code> \u015feklinde kullanabilirsiniz.<\/p>\n<h4>Linkler ve Y\u00f6nlendirmeler<\/h4>\n<p>Daha \u00f6nce de g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Rails <code>link_to<\/code> ve <code>redirect_to<\/code> gibi helper'lar sunar:<\/p>\n<p>*   <code><%= link_to &#039;Ana Sayfa&#039;, root_path %><\/code>: Bir HTML <code><a><\/code> etiketi olu\u015fturur. <code>root_path<\/code> gibi rota helper'lar\u0131 sayesinde URL'ler dinamik olarak olu\u015fturulur.<br \/>\n*   <code>redirect_to posts_path<\/code>: Bir HTTP y\u00f6nlendirmesi yapar, taray\u0131c\u0131ya yeni bir URL'ye gitmesini s\u00f6yler.<\/p>\n<p>Rails'in sa\u011flad\u0131\u011f\u0131 bu helper'lar, uygulaman\u0131z\u0131n URL yap\u0131s\u0131 de\u011fi\u015fse bile kodunuzu g\u00fcncelleme ihtiyac\u0131n\u0131 en aza indirir.<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Temel bir Rails uygulamas\u0131 in\u015fa etmeyi \u00f6\u011frendikten sonra, daha karma\u015f\u0131k ve ger\u00e7ek d\u00fcnya uygulamalar\u0131 i\u00e7in bilmeniz gereken baz\u0131 \u00f6nemli konulara de\u011finelim.<\/p>\n<h4>Kimlik Do\u011frulama (Authentication) ve Yetkilendirme (Authorization)<\/h4>\n<p>Kullan\u0131c\u0131 y\u00f6netimi ve yetkilendirme, \u00e7o\u011fu web uygulamas\u0131n\u0131n olmazsa olmaz\u0131d\u0131r.<br \/>\n*   <strong>Authentication (Kimlik Do\u011frulama):<\/strong> Kullan\u0131c\u0131n\u0131n kim oldu\u011funu do\u011frular (\u00f6rn. giri\u015f yapma, kay\u0131t olma). <code>Devise<\/code> gem'i, Rails uygulamalar\u0131nda kullan\u0131c\u0131 kimlik do\u011frulamas\u0131n\u0131 h\u0131zl\u0131 ve kolay bir \u015fekilde entegre etmek i\u00e7in en pop\u00fcler \u00e7\u00f6z\u00fcmd\u00fcr.<br \/>\n*   <strong>Authorization (Yetkilendirme):<\/strong> Kimli\u011fi do\u011frulanm\u0131\u015f bir kullan\u0131c\u0131n\u0131n belirli bir eylemi yap\u0131p yapamayaca\u011f\u0131n\u0131 belirler (\u00f6rn. sadece y\u00f6neticiler g\u00f6nderi silebilir). <code>Pundit<\/code> veya <code>CanCanCan<\/code> gibi gem'ler, yetkilendirme kurallar\u0131n\u0131 tan\u0131mlamak i\u00e7in esnek yollar sunar.<\/p>\n<h4>Arka Plan \u0130\u015fleri (Background Jobs)<\/h4>\n<p>E-posta g\u00f6nderme, resim i\u015fleme, veri i\u00e7e\/d\u0131\u015fa aktarma gibi uzun s\u00fcren veya zaman alan i\u015flemler, web iste\u011fi s\u0131ras\u0131nda yap\u0131lmamal\u0131d\u0131r. Bu t\u00fcr i\u015flemleri arka plan i\u015fleri olarak \u00e7al\u0131\u015ft\u0131rmak, uygulaman\u0131z\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcn h\u0131zl\u0131 ve duyarl\u0131 kalmas\u0131n\u0131 sa\u011flar. Rails, <code>Active Job<\/code> \u00e7er\u00e7evesi ile arka plan i\u015flerini soyutlar ve <code>Sidekiq<\/code>, <code>Resque<\/code> veya <code>Delayed Job<\/code> gibi farkl\u0131 kuyruk adapt\u00f6rleriyle entegre olabilir.<\/p>\n<h4>Test Etme<\/h4>\n<p>Yaz\u0131l\u0131m geli\u015ftirmede testler, kodunuzun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olman\u0131n ve gelecekteki de\u011fi\u015fikliklerin mevcut i\u015flevselli\u011fi bozmad\u0131\u011f\u0131ndan emin olman\u0131n kritik bir yoludur. Rails, <code>Minitest<\/code> ile birlikte gelir ve kapsaml\u0131 test ara\u00e7lar\u0131 sunar:<br \/>\n*   <strong>Unit Testleri:<\/strong> Modeller gibi k\u00fc\u00e7\u00fck, izole kod birimlerini test eder.<br \/>\n*   <strong>Integration Testleri:<\/strong> Controller'lar\u0131n ve rotalar\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test eder.<br \/>\n*   <strong>Feature (System) Testleri:<\/strong> Kullan\u0131c\u0131 senaryolar\u0131n\u0131 bir taray\u0131c\u0131 gibi davranarak test eder (\u00f6rn. Capybara ile).<br \/>\n<code>RSpec<\/code> gem'i de Rails toplulu\u011funda pop\u00fcler bir alternatif test \u00e7er\u00e7evesidir.<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>Rails, bir\u00e7ok yayg\u0131n web zafiyetine kar\u015f\u0131 yerle\u015fik korumalar sa\u011flar:<br \/>\n*   <strong>CSRF (Cross-Site Request Forgery) Korumas\u0131:<\/strong> <code>protect_from_forgery<\/code> metodu ile otomatik olarak korunur.<br \/>\n*   <strong>SQL Enjeksiyonu:<\/strong> Active Record, sorgular\u0131 parametreli olarak olu\u015fturarak SQL enjeksiyonlar\u0131na kar\u015f\u0131 koruma sa\u011flar.<br \/>\n*   <strong>XSS (Cross-Site Scripting):<\/strong> View'lerdeki <code>ERB<\/code> etiketleri (\u00f6rn. <code><%= ... %><\/code>) varsay\u0131lan olarak HTML i\u00e7eri\u011fini ka\u00e7\u0131rarak (escaping) XSS sald\u0131r\u0131lar\u0131n\u0131 \u00f6nler.<br \/>\n*   <strong>Mass Assignment:<\/strong> <code>strong parameters<\/code> kullanarak, kullan\u0131c\u0131n\u0131n izinsiz s\u00fctunlar\u0131 de\u011fi\u015ftirmesini engeller.<\/p>\n<p>Yine de, geli\u015ftiricinin her zaman g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 takip etmesi ve g\u00fcncel kalmas\u0131 \u00f6nemlidir.<\/p>\n<h4>Performans Optimizasyonu<\/h4>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda performans kritik hale gelebilir:<br \/>\n*   <strong>N+1 Sorgular\u0131:<\/strong> Bir d\u00f6ng\u00fc i\u00e7inde her \u00f6\u011fe i\u00e7in ayr\u0131 bir veritaban\u0131 sorgusu yap\u0131lmas\u0131d\u0131r. <code>includes<\/code> veya <code>eager_load<\/code> gibi Active Record metodlar\u0131 kullan\u0131larak \u00e7\u00f6z\u00fcl\u00fcr.<br \/>\n*   <strong>\u00d6nbellekleme (Caching):<\/strong> S\u0131k eri\u015filen ancak nadiren de\u011fi\u015fen verileri \u00f6nbellekte tutarak veritaban\u0131 sorgular\u0131n\u0131 azalt\u0131r. Rails, farkl\u0131 \u00f6nbellekleme stratejileri (sayfa, aksiyon, par\u00e7a, fragment) sunar.<br \/>\n*   <strong>Veritaban\u0131 \u0130ndeksleri:<\/strong> S\u0131k\u00e7a sorgulanan s\u00fctunlara indeks ekleyerek sorgu performans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Da\u011f\u0131t\u0131m (Deployment)<\/h3>\n<p>Uygulaman\u0131z geli\u015ftirme ortam\u0131nda \u00e7al\u0131\u015f\u0131r duruma geldi\u011finde, onu canl\u0131 bir sunucuya da\u011f\u0131tman\u0131z gerekir, b\u00f6ylece herkes eri\u015febilir.<\/p>\n<h4>Ortamlar (Environments)<\/h4>\n<p>Rails'in \u00fc\u00e7 ana ortam\u0131 vard\u0131r:<br \/>\n*   <strong>development:<\/strong> Geli\u015ftirme a\u015famas\u0131 i\u00e7in. Hata ay\u0131klama kolayd\u0131r, \u00f6nbellekleme kapal\u0131d\u0131r.<br \/>\n*   <strong>test:<\/strong> Testleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in.<br \/>\n*   <strong>production:<\/strong> Canl\u0131 sunucuda \u00e7al\u0131\u015fan ortam. Performans odakl\u0131d\u0131r, hata mesajlar\u0131 kullan\u0131c\u0131ya g\u00f6sterilmez, \u00f6nbellekleme a\u00e7\u0131kt\u0131r.<\/p>\n<p>Her ortam\u0131n kendine ait yap\u0131land\u0131rma dosyalar\u0131 <code>config\/environments\/<\/code> dizini alt\u0131nda bulunur.<\/p>\n<h4>Haz\u0131rl\u0131k Ad\u0131mlar\u0131<\/h4>\n<p>Da\u011f\u0131t\u0131mdan \u00f6nce yap\u0131lmas\u0131 gereken baz\u0131 genel ad\u0131mlar:<br \/>\n*   <strong>Asset Precompilation:<\/strong> Production ortam\u0131nda, CSS ve JavaScript varl\u0131klar\u0131 \u00f6nceden derlenmeli, s\u0131k\u0131\u015ft\u0131r\u0131lmal\u0131 ve birle\u015ftirilmelidir. <code>rails assets:precompile<\/code> komutu bu i\u015flemi yapar.<br \/>\n*   <strong>Veritaban\u0131 Ayarlar\u0131:<\/strong> Production ortam\u0131 i\u00e7in <code>config\/database.yml<\/code> dosyas\u0131nda do\u011fru veritaban\u0131 kimlik bilgileri ve ba\u011flant\u0131 havuzu ayarlar\u0131 olmal\u0131d\u0131r.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> Hassas bilgiler (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) do\u011frudan kodda saklanmamal\u0131, ortam de\u011fi\u015fkenleri (<code>ENV<\/code>) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilmelidir.<\/p>\n<h4>Da\u011f\u0131t\u0131m Platformlar\u0131<\/h4>\n<p>Rails uygulamalar\u0131n\u0131 da\u011f\u0131tmak i\u00e7in bir\u00e7ok se\u00e7enek mevcuttur:<br \/>\n*   <strong>Heroku:<\/strong> Rails uygulamalar\u0131 i\u00e7in pop\u00fcler ve kullan\u0131m\u0131 kolay bir PaaS (Platform as a Service). K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in h\u0131zl\u0131 da\u011f\u0131t\u0131m imkan\u0131 sunar.<br \/>\n*   <strong>Render:<\/strong> Heroku'ya benzer modern bir PaaS.<br \/>\n*   <strong>DigitalOcean, AWS, Google Cloud, Azure:<\/strong> IaaS (Infrastructure as a Service) sa\u011flay\u0131c\u0131lar\u0131. Daha fazla kontrol ve esneklik sunar ancak daha fazla y\u00f6netim gerektirir. Capistrano gibi ara\u00e7lar bu platformlara da\u011f\u0131t\u0131m\u0131 otomatikle\u015ftirebilir.<br \/>\n*   <strong>Fly.io:<\/strong> Yeni nesil da\u011f\u0131t\u0131m platformlar\u0131ndan biri, \u00f6zellikle k\u00fcresel \u00f6l\u00e7ekte uygulamalar i\u00e7in.<\/p>\n<p>Her platformun kendine \u00f6zg\u00fc da\u011f\u0131t\u0131m ad\u0131mlar\u0131 vard\u0131r, ancak temel olarak uygulaman\u0131z\u0131n kodunu sunucuya y\u00fcklemek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurmak (<code>bundle install<\/code>), veritaban\u0131 migration'lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak (<code>rails db:migrate<\/code>) ve bir web sunucusu (\u00f6rn. Puma) ba\u015flatmaktan ibarettir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Ruby on Rails ile bir web uygulamas\u0131 in\u015fa etmenin temel ad\u0131mlar\u0131n\u0131 ve \u00f6nemli kavramlar\u0131n\u0131 ele ald\u0131k. Geli\u015ftirme ortam\u0131 kurulumundan ba\u015flayarak, MVC mimarisini, Active Record'u, CRUD i\u015flevselli\u011fini ve front-end varl\u0131k y\u00f6netimini \u00f6\u011frendik. Ayr\u0131ca, kimlik do\u011frulama, arka plan i\u015fleri, test etme, g\u00fcvenlik ve performans optimizasyonu gibi daha geli\u015fmi\u015f konulara da de\u011findik ve uygulaman\u0131z\u0131 canl\u0131ya alma s\u00fcre\u00e7leri hakk\u0131nda bilgi edindik.<\/p>\n<p>Ruby on Rails, y\u00fcksek \u00fcretkenli\u011fi, geli\u015ftirici dostu yap\u0131s\u0131 ve zengin ekosistemi sayesinde web uygulamalar\u0131 geli\u015ftirmek i\u00e7in harika bir se\u00e7imdir. \"Convention Over Configuration\" prensibi, sizi gereksiz kararlardan kurtar\u0131rken, g\u00fc\u00e7l\u00fc gem'ler ve ara\u00e7lar, karma\u015f\u0131k i\u015flevsellikleri kolayca eklemenizi sa\u011flar. Geni\u015f ve aktif bir toplulu\u011fa sahip olmas\u0131 da tak\u0131ld\u0131\u011f\u0131n\u0131zda yard\u0131m bulmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Rails \u00f6\u011frenme e\u011frisi ba\u015flang\u0131\u00e7ta biraz dik gibi g\u00f6r\u00fcnse de, temel prensipleri kavrad\u0131k\u00e7a ne kadar g\u00fc\u00e7l\u00fc ve verimli oldu\u011funu fark edeceksiniz. Kendi projelerinizi in\u015fa etmeye devam edin, farkl\u0131 gem'leri ke\u015ffedin ve toplulukla etkile\u015fimde kal\u0131n. Unutmay\u0131n, en iyi \u00f6\u011frenme y\u00f6ntemi pratik yapmakt\u0131r. Bu rehberdeki bilgileri kullanarak kendi fikirlerinizi hayata ge\u00e7irmeye ba\u015flay\u0131n ve Ruby on Rails d\u00fcnyas\u0131n\u0131n sundu\u011fu s\u0131n\u0131rs\u0131z olanaklar\u0131 ke\u015ffedin!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber\nRuby on Rails (genellikle &#8220;Rails&#8221; olarak an\u0131l\u0131r), web uygulamalar\u0131 geli\u015ftirm","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-33329","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>Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber Ruby on Rails (genellikle &quot;Rails&quot; olarak an\u0131l\u0131r), web uygulamalar\u0131 geli\u015ftirm\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-01T13:41:22+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-01T13:41:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\"},\"wordCount\":3669,\"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\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\",\"name\":\"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-01T13:41:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber\"}]},{\"@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":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber","og_description":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber Ruby on Rails (genellikle \"Rails\" olarak an\u0131l\u0131r), web uygulamalar\u0131 geli\u015ftirm","og_url":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-01T13:41:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-01T13:41:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/"},"wordCount":3669,"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\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/","name":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-01T13:41:22+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-on-rails-uygulamasi-nasil-insa-edilir-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby on Rails Uygulamas\u0131 Nas\u0131l \u0130n\u015fa Edilir: Kapsaml\u0131 Bir Rehber"}]},{"@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\/33329","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=33329"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33329\/revisions"}],"predecessor-version":[{"id":33330,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33329\/revisions\/33330"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}