{"id":33660,"date":"2025-11-05T16:01:59","date_gmt":"2025-11-05T13:01:59","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/"},"modified":"2025-11-05T16:01:59","modified_gmt":"2025-11-05T13:01:59","slug":"ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/","title":{"rendered":"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<p>Ruby projelerinde bir <code>.tt<\/code> dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen &#8220;Bu da neyin nesi?&#8221; oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby&#8217;nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, <code>.tt<\/code> dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\u011f\u0131z.<\/p>\n<p>Ruby geli\u015ftiricileri olarak genellikle <code>.erb<\/code>, <code>.haml<\/code> veya <code>.slim<\/code> gibi dosya uzant\u0131lar\u0131na a\u015finay\u0131z. Bu uzant\u0131lar, dinamik HTML veya metin i\u00e7eri\u011fi olu\u015fturmak i\u00e7in kulland\u0131\u011f\u0131m\u0131z \u015fablon motorlar\u0131n\u0131 do\u011frudan i\u015faret eder. Ancak bir Ruby projesinin derinliklerinde beklenmedik bir <code>.tt<\/code> dosyas\u0131yla kar\u015f\u0131la\u015fmak, \u00e7o\u011fu zaman ka\u015flar\u0131 kald\u0131ran bir durumdur. Bunun temel nedeni, <code>.tt<\/code> uzant\u0131s\u0131n\u0131n Ruby&#8217;nin \u00e7ekirdek k\u00fct\u00fcphanelerinde veya pop\u00fcler \u00e7er\u00e7evelerinde (Rails, Sinatra vb.) standart bir \u015fablon format\u0131n\u0131 temsil etmemesidir. Bu durum, \u00e7o\u011fu zaman bir yan\u0131lg\u0131ya veya yanl\u0131\u015f anlamaya yol a\u00e7abilir; zira bu dosyalar ya \u00f6zel bir uygulaman\u0131n par\u00e7as\u0131d\u0131r ya da Ruby d\u0131\u015f\u0131 bir kaynaktan, \u00f6zellikle de Perl&#8217;deki <a href=\"https:\/\/metacpan.org\/pod\/Text::Template\" target=\"_blank\" rel=\"noopener noreferrer\">Text::Template<\/a> veya <a href=\"https:\/\/template-toolkit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Template Toolkit<\/a> gibi g\u00fc\u00e7l\u00fc \u015fablon sistemlerinden miras kalm\u0131\u015f olabilir.<\/p>\n<p>Peki, e\u011fer standart de\u011filse, neden kar\u015f\u0131m\u0131za \u00e7\u0131k\u0131yorlar? Genellikle <code>.tt<\/code> uzant\u0131s\u0131na sahip bir dosyan\u0131n bir Ruby projesinde bulunmas\u0131n\u0131n birka\u00e7 olas\u0131 nedeni vard\u0131r. \u0130lk olarak, projenin eski bir Perl tabanl\u0131 sistemle entegrasyonu s\u00f6z konusu olabilir. Bu durumda, Ruby uygulamas\u0131, Perl taraf\u0131ndan olu\u015fturulan veya Perl&#8217;in \u015fablon motoruyla i\u015flenmesi gereken metin \u015fablonlar\u0131n\u0131 bar\u0131nd\u0131r\u0131yor olabilir. \u0130kinci bir senaryo ise, projenin kendi i\u00e7inde \u00f6zel (custom) bir \u015fablon motoru geli\u015ftirmi\u015f olmas\u0131d\u0131r. Baz\u0131 geli\u015ftiriciler, belirli bir ihtiyaca y\u00f6nelik olarak basit bir metin de\u011fi\u015ftirme mekanizmas\u0131 kurar ve bu t\u00fcr \u015fablon dosyalar\u0131 i\u00e7in <code>.tt<\/code> gibi benzersiz bir uzant\u0131 se\u00e7ebilirler. Bu, \u00f6zellikle karma\u015f\u0131k \u015fablon motorlar\u0131n\u0131n getirdi\u011fi ek y\u00fckten ka\u00e7\u0131nmak istenen k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli ara\u00e7larda veya kod \u00fcretim (code generation) g\u00f6revlerinde g\u00f6r\u00fclebilir.<\/p>\n<p>\u00d6zetle, <code>.tt<\/code> dosyalar\u0131 Ruby&#8217;de &#8220;gizli bir g\u00fc\u00e7&#8221;ten ziyade, genellikle projenin ge\u00e7mi\u015fi, d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya spesifik, ni\u015f ihtiya\u00e7lar\u0131 hakk\u0131nda \u00f6nemli ipu\u00e7lar\u0131 veren &#8220;\u00f6zel bir durum&#8221; i\u015faretidir. Bu dosyalar\u0131 anlamak i\u00e7in sadece uzant\u0131s\u0131na bakmak yeterli de\u011fildir; ayn\u0131 zamanda projenin genel mimarisine ve ilgili kod par\u00e7ac\u0131klar\u0131na da g\u00f6z atmak gerekir. Bu yakla\u015f\u0131mla, projenin bu t\u00fcr dosyalar\u0131 neden ve nas\u0131l kulland\u0131\u011f\u0131n\u0131 daha iyi kavrayabilir ve gerekti\u011finde m\u00fcdahale edebilirsiniz. \u00d6rne\u011fin, projenin kaynak kodunda bu dosyalar\u0131 okuyan veya i\u015fleyen metodlar\u0131 aramak, ba\u015flang\u0131\u00e7 i\u00e7in iyi bir ad\u0131m olacakt\u0131r. B\u00f6ylece, standart d\u0131\u015f\u0131 bir uzant\u0131n\u0131n sizi yan\u0131ltmas\u0131na izin vermemi\u015f olursunuz.<\/p>\n<h3>Ruby&#8217;de Yayg\u0131n \u015eablon Motorlar\u0131: Neden .tt Yerine Bunlar\u0131 G\u00f6r\u00fcyoruz?<\/h3>\n<p>Ruby ekosistemi, dinamik i\u00e7erik olu\u015fturma konusunda olduk\u00e7a zengin ve \u00e7e\u015fitli \u015fablon motorlar\u0131na ev sahipli\u011fi yapar. Bu motorlar, genellikle web geli\u015ftirme \u00e7er\u00e7eveleri (\u00f6zellikle Ruby on Rails) ile s\u0131k\u0131 bir entegrasyon i\u00e7inde \u00e7al\u0131\u015farak, geli\u015ftiricilere HTML, XML, JSON veya herhangi bir metin tabanl\u0131 \u00e7\u0131kt\u0131y\u0131 kolayca \u00fcretme imkan\u0131 sunar. <code>.tt<\/code> dosyalar\u0131n\u0131n aksine, bu motorlar\u0131n uzant\u0131lar\u0131 ve kullan\u0131m \u015fekilleri sekt\u00f6rde de facto standartlar haline gelmi\u015ftir. Bu pop\u00fclerlik, hem g\u00fc\u00e7l\u00fc \u00f6zellikleri hem de geni\u015f topluluk deste\u011fi sayesinde sa\u011flanm\u0131\u015ft\u0131r. \u0130\u015fte Ruby&#8217;de en s\u0131k kar\u015f\u0131la\u015f\u0131lan \u015fablon motorlar\u0131 ve onlar\u0131 <code>.tt<\/code> benzeri \u00f6zel \u00e7\u00f6z\u00fcmlerden ay\u0131ran temel \u00f6zellikler:<\/p>\n<ul>\n<li><strong>ERB (Embedded Ruby):<\/strong> Ruby&#8217;nin \u00e7ekirdek k\u00fct\u00fcphanelerinde yer alan ve en temel, ayn\u0131 zamanda en yayg\u0131n \u015fablon motorudur. HTML i\u00e7ine Ruby kodu g\u00f6mme mant\u0131\u011f\u0131na dayan\u0131r ve <code><% ... %><\/code> veya <code><%= ... %><\/code> etiketleriyle \u00e7al\u0131\u015f\u0131r. Basit s\u00f6zdizimi ve d\u00fc\u015f\u00fck \u00f6\u011frenme e\u011frisi sayesinde pek \u00e7ok Rails ve di\u011fer Ruby projelerinde tercih edilir.<\/li>\n<li><strong>Haml (HTML Abstraction Markup Language):<\/strong> Daha temiz, \u00f6zl\u00fc ve DRY (Don&#8217;t Repeat Yourself) bir yakla\u015f\u0131m sunar. Etiketler yerine girintileme ve CSS se\u00e7icilerine benzer s\u00f6zdizimi kullan\u0131r, bu da HTML&#8217;i daha okunabilir hale getirir. \u00d6rne\u011fin, <code>%div.container<\/code> bir <code>\n<div class=\"container\"><\/div>\n<p><\/code> etiketi olu\u015fturur.<\/li>\n<li><strong>Slim (Templating Language for Ruby):<\/strong> Haml&#8217;a benzer \u015fekilde minimalizm ve performans odakl\u0131d\u0131r. Daha da az s\u00f6zdizimiyle ayn\u0131 ifade g\u00fcc\u00fcn\u00fc sunar ve genellikle Haml&#8217;dan daha h\u0131zl\u0131 render edilir. \u00d6zellikle performans\u0131n kritik oldu\u011fu uygulamalarda tercih edilebilir.<\/li>\n<\/ul>\n<p>Bu \u015fablon motorlar\u0131n\u0131n her biri, belirli bir felsefe ve kullan\u0131m senaryosuna g\u00f6re tasarlanm\u0131\u015ft\u0131r. ERB, Ruby ile do\u011frudan ve basit bir entegrasyon sa\u011flarken, Haml ve Slim daha soyut ve geli\u015ftirici verimlili\u011fini art\u0131ran yakla\u015f\u0131mlar sunar. \u00d6rne\u011fin, bir web sayfas\u0131n\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 dinamik olarak olu\u015fturmak i\u00e7in ERB ile a\u015fa\u011f\u0131daki gibi bir kod yazabiliriz:<\/p>\n<pre><code class=\"language-erb\"><!-- app\/views\/layouts\/application.html.erb -->\n<!DOCTYPE html>\n<html>\n<head>\n  <title><%= @page_title || \"Varsay\u0131lan Ba\u015fl\u0131k\" %><\/title>\n  <%= csrf_meta_tags %>\n  <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>\n  <%= javascript_link_tag 'application', 'data-turbolinks-track': 'reload' %>\n<\/head>\n<body>\n  <%= yield %>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code><%= ... %><\/code> etiketleri aras\u0131na yerle\u015ftirilen Ruby kodu, \u015fablon i\u015flenirken de\u011ferlendirilir ve sonucu \u00e7\u0131kt\u0131n\u0131n i\u00e7ine eklenir. Bu \u015feffaf ve g\u00fc\u00e7l\u00fc yap\u0131, <code>.tt<\/code> gibi \u00f6zel dosya formatlar\u0131n\u0131n yerel Ruby projelerinde neden nadiren g\u00f6r\u00fcld\u00fc\u011f\u00fcn\u00fc a\u00e7\u0131kl\u0131yor. \u00c7\u00fcnk\u00fc zaten kan\u0131tlanm\u0131\u015f, zengin \u00f6zelliklere sahip ve iyi belgelenmi\u015f alternatifler mevcuttur. Dolay\u0131s\u0131yla, bir <code>.tt<\/code> dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, genellikle daha derin bir ba\u011flama i\u015faret etti\u011fini ve standart bir \u015fablon i\u015fleme gemiyle do\u011frudan uyumlu olmayabilece\u011fini anlamak \u00f6nemlidir.<\/p>\n<h2>Bir Ruby Projesinde .tt Dosyas\u0131yla Kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda Ne Anlama Geliyor? Senaryolar ve Yakla\u015f\u0131mlar<\/h2>\n<p>Bir Ruby projesinde <code>.tt<\/code> uzant\u0131l\u0131 bir dosyaya rastlamak, ilk ba\u015fta \u015fa\u015f\u0131rt\u0131c\u0131 olabilir. Ancak bu, genellikle projenin benzersiz ihtiya\u00e7lar\u0131na veya ge\u00e7mi\u015fine i\u015faret eden \u00f6zel bir durumdur. Bu b\u00f6l\u00fcmde, bu senaryolar\u0131 detayland\u0131racak ve her bir durum i\u00e7in nas\u0131l bir yakla\u015f\u0131m sergilemeniz gerekti\u011fini inceleyece\u011fiz. Unutmay\u0131n, bu dosyalar\u0131n yorumlanmas\u0131, projenin genel mimarisine ve kod taban\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<h3>Senaryo 1: Ev Yap\u0131m\u0131 \u00c7\u00f6z\u00fcmler (Custom Template Engine)<\/h3>\n<p>Baz\u0131 durumlarda, bir geli\u015ftirici karma\u015f\u0131k bir \u015fablon motoru yerine kendi basit metin i\u015fleme mekanizmas\u0131n\u0131 tercih edebilir. \u00d6zellikle k\u00fc\u00e7\u00fck yard\u0131mc\u0131 programlar, konfig\u00fcrasyon dosyalar\u0131 olu\u015fturma veya kod iskeletleri (scaffolding) \u00fcretme gibi g\u00f6revlerde bu yakla\u015f\u0131m g\u00f6r\u00fclebilir. <code>.tt<\/code> uzant\u0131s\u0131 burada \"Text Template\" (Metin \u015eablonu) veya \"Tiny Template\" gibi \u00f6zel bir anlam ta\u015f\u0131yabilir. Bu t\u00fcr bir senaryoda, <code>.tt<\/code> dosyas\u0131 genellikle basit de\u011fi\u015fken ikame (string interpolation) veya \u00f6nceden tan\u0131mlanm\u0131\u015f etiketleri metinlerle de\u011fi\u015ftirme mant\u0131\u011f\u0131yla \u00e7al\u0131\u015f\u0131r.<\/p>\n<p><strong>Vaka Analizi: Otomatik Konfig\u00fcrasyon Dosyas\u0131 \u00dcretimi<\/strong><\/p>\n<p>Bir Ruby projesinin, farkl\u0131 ortamlar i\u00e7in (geli\u015ftirme, test, \u00fcretim) \u00f6zel konfig\u00fcrasyon dosyalar\u0131 olu\u015fturmas\u0131 gerekti\u011fini varsayal\u0131m. Bu durumda, geli\u015ftirici basit bir <code>.tt<\/code> dosyas\u0131 olu\u015fturarak genel \u015fablonu tutar ve Ruby kodu bu \u015fablondaki yer tutucular\u0131 ger\u00e7ek de\u011ferlerle doldurur.<\/p>\n<pre><code class=\"language-ruby\"># config\/template.tt\ndatabase_url=<%= database_url %>\napi_key=<%= api_key %>\nlog_level=<%= log_level %>\n\n# app\/services\/config_generator.rb\nrequire 'erb'\n\nclass ConfigGenerator\n  def initialize(env_vars)\n    @env_vars = env_vars\n  end\n\n  def generate(template_path, output_path)\n    template_content = File.read(template_path)\n    erb_template = ERB.new(template_content, nil, '-') # <code>-<\/code> for trim mode\n\n    # Bind environment variables to the template context\n    context = OpenStruct.new(@env_vars)\n    output = erb_template.result(context.instance_eval { binding })\n\n    File.write(output_path, output)\n    puts \"Konfig\u00fcrasyon dosyas\u0131 #{output_path} adresine ba\u015far\u0131yla olu\u015fturuldu.\"\n  end\nend\n\n# Kullan\u0131m \u00f6rne\u011fi\n# require 'ostruct' # OpenStruct i\u00e7in\n# env_config = {\n#   database_url: \"postgres:\/\/user:pass@host:5432\/prod_db\",\n#   api_key: \"PROD_API_KEY_123\",\n#   log_level: \"info\"\n# }\n# generator = ConfigGenerator.new(env_config)\n# generator.generate(\"config\/template.tt\", \"config\/production.env\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>.tt<\/code> dosyas\u0131 asl\u0131nda ERB s\u00f6zdizimiyle yaz\u0131lm\u0131\u015ft\u0131r ve Ruby'nin kendi ERB motoru taraf\u0131ndan i\u015flenmektedir. Geli\u015ftirici burada sadece uzant\u0131y\u0131 <code>.erb<\/code> yerine <code>.tt<\/code> olarak se\u00e7mi\u015f olabilir. B\u00f6yle bir durumda, dosyan\u0131n i\u00e7eri\u011fine bakarak hangi \u015fablon motorunun kullan\u0131ld\u0131\u011f\u0131n\u0131 (veya taklit edildi\u011fini) anlamak kritik \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>Senaryo 2: D\u0131\u015f Ara\u00e7 Entegrasyonu (\u00d6zellikle Perl'den Geliyorsa)<\/h3>\n<p>Daha \u00f6nce de belirtti\u011fimiz gibi, <code>.tt<\/code> uzant\u0131s\u0131 en \u00e7ok Perl d\u00fcnyas\u0131ndaki <a href=\"https:\/\/template-toolkit.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Template Toolkit<\/a> (TT) ile ili\u015fkilidir. E\u011fer bir Ruby projesi, eski bir Perl uygulamas\u0131yla etkile\u015fim kuruyor, ondan veri al\u0131yor veya onun \u00fcretti\u011fi dosyalar\u0131 kullan\u0131yorsa, bu t\u00fcr <code>.tt<\/code> dosyalar\u0131yla kar\u015f\u0131la\u015fmak olas\u0131d\u0131r. Bu durumda Ruby projesi, TT \u015fablonlar\u0131n\u0131 do\u011frudan i\u015flemek yerine, genellikle \u015fu yollar\u0131 izler:<\/p>\n<ul>\n<li><strong>Harici bir komut \u00e7a\u011f\u0131rma:<\/strong> Ruby, Perl betiklerini veya TT i\u015fleyicilerini bir sistem komutu olarak \u00e7a\u011f\u0131r\u0131r ve \u00e7\u0131kt\u0131s\u0131n\u0131 yakalar.<\/li>\n<li><strong>\u00d6nceden i\u015flenmi\u015f dosyalar\u0131 kullanma:<\/strong> TT dosyalar\u0131 ba\u015fka bir s\u00fcre\u00e7 taraf\u0131ndan HTML veya metin dosyalar\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve Ruby uygulamas\u0131 bu statik \u00e7\u0131kt\u0131lar\u0131 kullan\u0131r.<\/li>\n<li><strong>K\u00f6pr\u00fc (Bridge) mekanizmas\u0131:<\/strong> Nadiren de olsa, Ruby'den Perl'e \u00e7a\u011fr\u0131 yapmay\u0131 sa\u011flayan \u00f6zel gemler (\u00f6rne\u011fin <a href=\"https:\/\/github.com\/vladh\/ruby-perl\" target=\"_blank\" rel=\"noopener noreferrer\">ruby-perl<\/a> gibi) kullan\u0131larak TT \u015fablonlar\u0131 i\u015flenebilir, ancak bu olduk\u00e7a ni\u015f bir senaryodur.<\/li>\n<\/ul>\n<p><strong>Vaka Analizi: Eski Bir Raporlama Sisteminin Modernizasyonu<\/strong><\/p>\n<p>B\u00fcy\u00fck bir finans kurulu\u015fu, y\u0131llard\u0131r Perl tabanl\u0131 bir sistemle karma\u015f\u0131k finansal raporlar \u00fcretiyor. Bu raporlar\u0131n \u015fablonlar\u0131 <code>.tt<\/code> uzant\u0131l\u0131 dosyalar. \u015eirket, yeni bir web aray\u00fcz\u00fc i\u00e7in Ruby on Rails'e ge\u00e7i\u015f yap\u0131yor ancak eski raporlama mant\u0131\u011f\u0131n\u0131 korumak istiyor. Bu durumda, Rails uygulamas\u0131 do\u011frudan TT \u015fablonlar\u0131n\u0131 i\u015flememek yerine, bir Rake g\u00f6revi veya bir arka plan i\u015fi arac\u0131l\u0131\u011f\u0131yla Perl beti\u011fini \u00e7a\u011f\u0131rarak raporlar\u0131 olu\u015fturur ve daha sonra bu olu\u015fturulan HTML veya PDF dosyalar\u0131n\u0131 kullan\u0131c\u0131lara sunar.<\/p>\n<pre><code class=\"language-ruby\"># lib\/tasks\/generate_reports.rake\nnamespace :reports do\n  desc \"Generates financial reports using the legacy Perl system\"\n  task :generate, [:report_id] do |t, args|\n    report_id = args[:report_id]\n    unless report_id\n      puts \"Kullan\u0131m: rake reports:generate[RA_ID]\"\n      exit 1\n    end\n\n    perl_script_path = Rails.root.join(\"legacy_perl_system\", \"generate_report.pl\").to_s\n    output_dir = Rails.root.join(\"public\", \"reports\").to_s\n    \n    # Perl beti\u011fini \u00e7a\u011f\u0131r ve \u00e7\u0131kt\u0131y\u0131 yakala\n    command = \"perl #{perl_script_path} --report-id #{report_id} --output-dir #{output_dir}\"\n    puts \"Rapor olu\u015fturuluyor: #{command}\"\n    \n    system_output = <code>#{command}<\/code> # Backticks execute command and capture output\n    \n    if $?.success?\n      puts \"Rapor ba\u015far\u0131yla olu\u015fturuldu. Detaylar: \\n#{system_output}\"\n    else\n      warn \"Rapor olu\u015fturulurken hata olu\u015ftu: \\n#{system_output}\"\n      exit 1\n    end\n  end\nend\n<\/pre>\n<p><\/code><\/p>\n<p>Bu senaryoda, Ruby kodu <code>.tt<\/code> dosyalar\u0131n\u0131 do\u011frudan okumaz veya yorumlamaz. Bunun yerine, <code>.tt<\/code> dosyalar\u0131 Perl beti\u011fi taraf\u0131ndan i\u015flenir ve Ruby yaln\u0131zca bu harici s\u00fcrecin tetikleyicisi ve \u00e7\u0131kt\u0131 y\u00f6neticisi rol\u00fcn\u00fc \u00fcstlenir. Bu t\u00fcr bir entegrasyonla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, projenin bu harici sistemi nas\u0131l \u00e7a\u011f\u0131rd\u0131\u011f\u0131n\u0131 ve girdileri\/\u00e7\u0131kt\u0131lar\u0131 nas\u0131l y\u00f6netti\u011fini anlamak temel hedefiniz olmal\u0131d\u0131r.<\/p>\n<h3>Senaryo 3: Kod \u00dcretimi ve Scaffolding (Jenerat\u00f6rler)<\/h3>\n<p>Ruby projelerinde, \u00f6zellikle Rails ve Thor gibi ara\u00e7lar, otomatik kod \u00fcretimi (scaffolding) i\u00e7in \u015fablonlar kullan\u0131r. Bu \u015fablonlar genellikle <code>.erb<\/code> uzant\u0131l\u0131 olsa da, baz\u0131 ni\u015f jenerat\u00f6rler veya \u00f6zel ama\u00e7l\u0131 ara\u00e7lar kendi uzant\u0131lar\u0131n\u0131 kullanabilir ve bunlardan biri <code>.tt<\/code> olabilir. Bu, genellikle bir gemin veya projenin dahili mekanizmas\u0131d\u0131r ve son kullan\u0131c\u0131 taraf\u0131ndan nadiren do\u011frudan d\u00fczenlenir.<\/p>\n<p><strong>Vaka Analizi: \u00d6zel Bir Gemin Proje \u0130skelet Olu\u015fturma Yap\u0131s\u0131<\/strong><\/p>\n<p>Bir geli\u015ftirici, kendi kurumsal gemini olu\u015ftururken, yeni bir proje ba\u015flatt\u0131\u011f\u0131nda belirli bir dosya yap\u0131s\u0131n\u0131 ve ba\u015flang\u0131\u00e7 kodunu otomatik olarak eklemek istiyor. Bu gemin i\u00e7inde, <code>templates\/project_config.tt<\/code> ad\u0131nda bir dosya olabilir. Bu dosya, temel bir konfig\u00fcrasyon \u015fablonunu i\u00e7erir ve gemin kendi jenerat\u00f6r\u00fc taraf\u0131ndan kullan\u0131larak projenin yeni dizinine kopyalan\u0131r ve de\u011fi\u015fkenlerle doldurulur.<\/p>\n<pre><code class=\"language-ruby\"># lib\/my_gem\/generators\/project_generator.rb\nrequire 'thor\/group'\nrequire 'erb'\nrequire 'ostruct' # ERB ba\u011flam\u0131 i\u00e7in\n\nmodule MyGem\n  module Generators\n    class ProjectGenerator < Thor::Group\n      include Thor::Actions\n\n      def self.source_root\n        File.expand_path('..\/templates', __FILE__)\n      end\n\n      argument :name, type: :string, desc: \"Proje ad\u0131\"\n\n      def create_project_directory\n        empty_directory name\n        destination_root = File.join(destination_root, name) # Dizin de\u011fi\u015ftir\n        @destination_stack.push(destination_root) # Thor'un dizinini g\u00fcncelle\n      end\n\n      def copy_template_files\n        template 'project_config.tt', \"#{name}\/config\/initializers\/project_settings.rb\"\n        # Di\u011fer dosyalar\u0131 kopyala...\n      end\n\n      # Template methodunu ge\u00e7ersiz k\u0131l\u0131n, b\u00f6ylece .tt dosyas\u0131n\u0131 ERB olarak i\u015fleyebiliriz\n      def template(source, destination, *args, &#038;block)\n        say_status :template, destination\n        source_path = find_in_source_paths(source)\n        \n        # .tt dosyas\u0131n\u0131 ERB olarak oku ve i\u015fle\n        template_content = File.read(source_path)\n        erb = ERB.new(template_content)\n        \n        # ERB ba\u011flam\u0131n\u0131 olu\u015ftur (generator'\u0131n instance de\u011fi\u015fkenleri eri\u015filebilir olur)\n        context = OpenStruct.new(self.instance_values)\n        processed_content = erb.result(context.instance_eval { binding })\n        \n        create_file destination, processed_content, *args, &#038;block\n      end\n    end\n  end\nend\n\n# templates\/project_config.tt\n# module <%= name.capitalize %>\n#   SETTINGS = {\n#     environment: ENV['RACK_ENV'] || 'development',\n#     app_name: '<%= name %>',\n#     secret_key: ENV['SECRET_KEY'] || SecureRandom.hex(32)\n#   }.freeze\n# end\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, bir Thor jenerat\u00f6r\u00fcn\u00fcn <code>.tt<\/code> uzant\u0131s\u0131n\u0131 nas\u0131l kullanabilece\u011fini g\u00f6steriyor. Burada \u00f6nemli olan, jenerat\u00f6r\u00fcn <code>template<\/code> metodunu override ederek, <code>.tt<\/code> uzant\u0131l\u0131 dosyay\u0131 asl\u0131nda bir ERB \u015fablonu gibi i\u015flemesidir. Bu t\u00fcr bir durumda, <code>.tt<\/code> dosyas\u0131 yine do\u011frudan Ruby taraf\u0131ndan de\u011fil, bir jenerat\u00f6r \u00e7at\u0131s\u0131 alt\u0131nda \u00f6zel bir mant\u0131kla i\u015flenir. Projenin genel yap\u0131s\u0131n\u0131 ve kullan\u0131lan gemleri incelemek, bu t\u00fcr \u00f6zel kullan\u0131mlar\u0131 ortaya \u00e7\u0131karman\u0131n en iyi yoludur.<\/p>\n<div class=\"interactive-tip\">\n<p>Uzman \u0130pucu: Bir Ruby projesinde bilinmeyen bir dosya uzant\u0131s\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, ilk yapman\u0131z gereken \u015fey projenin <code>Gemfile<\/code> dosyas\u0131n\u0131 ve <code>lib\/<\/code> klas\u00f6r\u00fcndeki \u00f6zel kodlar\u0131 incelemektir. Ayr\u0131ca, dosya ad\u0131n\u0131 veya uzant\u0131s\u0131n\u0131 projenin tamam\u0131nda arayarak (<code>grep -r \".tt\" .<\/code> gibi komutlarla), bu dosyay\u0131 kullanan herhangi bir referans\u0131 veya i\u015fleyiciyi bulabilirsiniz. Bu, genellikle gizemin \u00e7\u00f6z\u00fcm\u00fcne giden en h\u0131zl\u0131 yoldur.<\/p>\n<\/p><\/div>\n<h3>Ruby'de Kendi .tt Benzeri \u015eablon Motorunuzu Nas\u0131l Olu\u015fturursunuz? (Mini \u00d6rnek)<\/h3>\n<p>Yukar\u0131daki senaryolarda da g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, <code>.tt<\/code> uzant\u0131s\u0131 genellikle \u00f6zel bir i\u015fleme mant\u0131\u011f\u0131na i\u015faret eder. Peki, kendinize ait, belki de daha basit bir \u015fablonlama ihtiyac\u0131n\u0131z oldu\u011funda, t\u0131pk\u0131 <code>.tt<\/code> gibi kendi \u00f6zel uzant\u0131n\u0131z\u0131 kullanan bir mekanizmay\u0131 Ruby'de nas\u0131l kurabilirsiniz? Bu, \u00f6zellikle dinamik metinler, e-posta \u015fablonlar\u0131 veya konfig\u00fcrasyon dosyalar\u0131 olu\u015fturmak istedi\u011finizde kullan\u0131\u015fl\u0131 olabilir. Amac\u0131m\u0131z, basit bir metin dosyas\u0131 i\u00e7inde belirli yer tutucular\u0131 tan\u0131mlamak ve bu yer tutucular\u0131 Ruby kodu ile dinamik olarak doldurmakt\u0131r.<\/p>\n<p>Basit bir yakla\u015f\u0131mla, Ruby'nin yerle\u015fik <code>ERB<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak kendi <code>.tt<\/code> \u015fablon i\u015flemcimizi olu\u015fturabiliriz. Bu, asl\u0131nda ilk senaryoda bahsetti\u011fimiz \"Ev Yap\u0131m\u0131 \u00c7\u00f6z\u00fcmler\"in bir genellemesidir. A\u015fa\u011f\u0131daki \u00f6rnek, bir veri nesnesini (veya hash'ini) bir <code>.tt<\/code> dosyas\u0131na nas\u0131l enjekte edece\u011fimizi ve i\u015flenmi\u015f \u00e7\u0131kt\u0131y\u0131 nas\u0131l alaca\u011f\u0131m\u0131z\u0131 g\u00f6stermektedir. Bu, esneklik ve kontrol isteyen geli\u015ftiriciler i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-ruby\">require 'erb'\nrequire 'ostruct' # Veri nesnesini ERB ba\u011flam\u0131na \u00e7evirmek i\u00e7in\n\nclass CustomTemplateProcessor\n  def initialize(template_path)\n    @template_content = File.read(template_path)\n  end\n\n  def render(data = {})\n    # ERB'nin de\u011fi\u015fkenlere eri\u015febilmesi i\u00e7in bir OpenStruct kullan\u0131yoruz.\n    # Bu sayede \u015fablon i\u00e7inde <code>data.my_variable<\/code> yerine do\u011frudan <code>my_variable<\/code> kullan\u0131labilir.\n    context = OpenStruct.new(data)\n    \n    # ERB nesnesini olu\u015ftururken, \u015fablonun i\u00e7eri\u011fini ve ba\u011flam\u0131 veriyoruz.\n    # <code>nil, nil, &#039;-&#039;<\/code> parametreleri ERB'nin trim modunu (bo\u015fluklar\u0131 silme) ayarlar.\n    erb = ERB.new(@template_content, nil, '-')\n    \n    # <code>result<\/code> metodu ile \u015fablonu i\u015fliyoruz.\n    # <code>context.instance_eval { binding }<\/code> ile OpenStruct nesnesinin ba\u011flam\u0131n\u0131 ERB'ye iletiyoruz.\n    erb.result(context.instance_eval { binding })\n  rescue StandardError => e\n    \"\u015eablon i\u015flenirken bir hata olu\u015ftu: #{e.message}\"\n  end\nend\n\n# \u00d6rnek .tt dosyas\u0131 i\u00e7eri\u011fi (template.tt)\n# Merhaba <%= user_name %>,\n#\n# Yeni projeniz: <%= project_name %>\n# Proje ID: <%= project_id %>\n# Durum: <%= status || 'Beklemede' %>\n#\n# \u0130yi g\u00fcnler dileriz!\n\n# Kullan\u0131m \u00f6rne\u011fi\n# File.write('template.tt', \"Merhaba <%= user_name %>, Yeni projeniz: <%= project_name %>\") # E\u011fer dosya yoksa\n\nprocessor = CustomTemplateProcessor.new('template.tt')\n\n# \u0130\u015flenecek veriler\nuser_data = {\n  user_name: 'Ay\u015fe Y\u0131lmaz',\n  project_name: 'Mobil Uygulama Geli\u015ftirme',\n  project_id: 'MA-2023-001'\n}\n\nrendered_output = processor.render(user_data)\nputs \"--- \u0130\u015flenmi\u015f \u00c7\u0131kt\u0131 ---\"\nputs rendered_output\n\nputs \"\\n--- Farkl\u0131 Verilerle \u0130\u015flem ---\"\nanother_user_data = {\n  user_name: 'Mehmet Demir',\n  project_name: 'Veritaban\u0131 Optimizasyonu',\n  project_id: 'DO-2023-005',\n  status: 'Tamamland\u0131'\n}\nputs processor.render(another_user_data)\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu basit yap\u0131, size <code>.tt<\/code> uzant\u0131s\u0131n\u0131 kendi \u00f6zel \u015fablonlama mant\u0131\u011f\u0131n\u0131z i\u00e7in nas\u0131l kullanabilece\u011finiz konusunda bir fikir verir. Burada \u00f6nemli olan, Ruby'nin g\u00fc\u00e7l\u00fc string i\u015fleme yeteneklerini ve <code>ERB<\/code> gibi yerle\u015fik \u015fablon motorlar\u0131n\u0131 nas\u0131l esnek bir \u015fekilde uyarlayabilece\u011finizi g\u00f6rmektir. Kendi motorunuzu yazarken, g\u00fcvenlik (\u00f6zellikle kullan\u0131c\u0131 taraf\u0131ndan sa\u011flanan \u015fablonlarla \u00e7al\u0131\u015f\u0131yorsan\u0131z) ve performans gibi konular\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z \u00f6nemlidir. Bu yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k \u015fablon motorlar\u0131na ihtiya\u00e7 duymayan, \u00f6zelle\u015ftirilmi\u015f ve hafif \u00e7\u00f6z\u00fcmler arayan projeler i\u00e7in ideal olabilir.<\/p>\n<h2>.tt Dosyalar\u0131n\u0131 Verimli Kullanma ve Sorun Giderme \u0130pu\u00e7lar\u0131 (\u0130leri D\u00fczey)<\/h2>\n<p>E\u011fer projenizde <code>.tt<\/code> dosyalar\u0131yla \u00e7al\u0131\u015fman\u0131z gerekiyorsa \u2013 ister \u00f6zel bir \u00e7\u00f6z\u00fcm\u00fcn par\u00e7as\u0131 olsun, ister harici bir sistemden miras kalm\u0131\u015f olsun \u2013 bunlar\u0131 verimli ve g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in baz\u0131 ipu\u00e7lar\u0131 ve en iyi uygulamalar mevcuttur. Bu dosyalar standart Ruby \u015fablon motorlar\u0131 gibi otomatik olarak i\u015flenmedi\u011fi i\u00e7in, dikkatli bir yakla\u015f\u0131m gerektirir.<\/p>\n<h3>1. Kapsaml\u0131 Belgeleme ve Anla\u015f\u0131labilirlik<\/h3>\n<p><code>.tt<\/code> dosyalar\u0131n\u0131n standart olmamas\u0131 nedeniyle, projenizde neden kullan\u0131ld\u0131klar\u0131n\u0131, hangi verilerle beslendiklerini ve hangi \u00e7\u0131kt\u0131lar\u0131 \u00fcrettiklerini a\u00e7\u0131k\u00e7a belgelemek hayati \u00f6nem ta\u015f\u0131r. Bu, \u00f6zellikle yeni tak\u0131m \u00fcyeleri i\u00e7in veya gelecekteki bak\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131\u011f\u0131 azaltacakt\u0131r. Dosyan\u0131n ba\u015f\u0131nda yorum sat\u0131rlar\u0131 ile kullan\u0131m amac\u0131n\u0131, beklenen girdileri ve i\u015fleme mant\u0131\u011f\u0131n\u0131 a\u00e7\u0131klay\u0131n.<\/p>\n<pre><code class=\"language-perl\"># my_template.tt (E\u011fer Perl Template Toolkit ise)\n[% # Bu \u015fablon, m\u00fc\u015fteri bilgilerini i\u00e7eren bir ho\u015f geldiniz e-postas\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.\n   # Girdiler: customer_name, order_number, support_email\n   # \u00c7\u0131kt\u0131: HTML format\u0131nda e-posta i\u00e7eri\u011fi\n%]\n<p>Merhaba [% customer_name %],<\/p>\n<p>Sipari\u015finiz # [% order_number %] ba\u015far\u0131yla al\u0131nm\u0131\u015ft\u0131r.<\/p>\n<p>Herhangi bir sorunuz olursa <a href=\"mailto:[% support_email %]\">[% support_email %]<\/a> adresinden bizimle ileti\u015fime ge\u00e7ebilirsiniz.<\/p>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu t\u00fcr yorumlar, \u00f6zellikle harici \u015fablon motorlar\u0131 kullan\u0131ld\u0131\u011f\u0131nda, Ruby taraf\u0131ndaki kodun bu \u015fablonlar\u0131 nas\u0131l i\u015fledi\u011fini anlamak i\u00e7in bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr.<\/p>\n<h3>2. G\u00fcvenlik \u0130hlallerine Kar\u015f\u0131 Koruma<\/h3>\n<p>Herhangi bir \u015fablon motorunda oldu\u011fu gibi, <code>.tt<\/code> dosyalar\u0131n\u0131 kullan\u0131c\u0131dan al\u0131nan verilerle i\u015flerken g\u00fcvenlik a\u00e7\u0131klar\u0131 riski vard\u0131r. \u00d6zellikle \"ev yap\u0131m\u0131\" \u015fablon motorlar\u0131nda, girdi do\u011frulama ve \u00e7\u0131kt\u0131 ka\u00e7\u0131\u015f (output escaping) mekanizmalar\u0131n\u0131 manuel olarak uygulamak gerekebilir. E\u011fer \u015fablonlar do\u011frudan HTML \u00e7\u0131kt\u0131s\u0131 \u00fcretiyorsa, XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 dikkatli olunmal\u0131d\u0131r. G\u00fcvenli bir \u015fekilde \u00e7\u0131kt\u0131 olu\u015fturmak i\u00e7in daima de\u011fi\u015fkenleri ka\u00e7\u0131\u015f (escape) fonksiyonlar\u0131ndan ge\u00e7irin.<\/p>\n<pre><code class=\"language-ruby\">require 'cgi' # CGI.escapeHTML i\u00e7in\n\n# custom_processor.rb i\u00e7indeki render metodu \u00f6rne\u011fi\ndef render_secure(data = {})\n  context = OpenStruct.new(data)\n  # Her de\u011fi\u015fkeni i\u015flerken HTML ka\u00e7\u0131\u015f\u0131 uygulayal\u0131m\n  template_with_escaped_vars = @template_content.gsub(\/<%= (\\w+) %>\/) do |match|\n    var_name = $1.to_sym\n    CGI.escapeHTML(context.send(var_name).to_s)\n  end\n  ERB.new(template_with_escaped_vars, nil, '-').result(context.instance_eval { binding })\nend\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, ERB i\u00e7indeki de\u011fi\u015fkenlere uygulanan basit bir g\u00fcvenlik \u00f6nlemidir. E\u011fer Perl Template Toolkit kullan\u0131l\u0131yorsa, TT'nin kendi <a href=\"https:\/\/template-toolkit.org\/docs\/manual\/Variables.html#section_vmethods\" target=\"_blank\" rel=\"noopener noreferrer\"><code>html<\/code> vmethod'u<\/a> veya <a href=\"https:\/\/template-toolkit.org\/docs\/manual\/Directives.html#section_FILTER\" target=\"_blank\" rel=\"noopener noreferrer\"><code>FILTER<\/code> direktifi<\/a> gibi \u00f6zelliklerini kullanarak \u00e7\u0131kt\u0131 g\u00fcvenli\u011fini sa\u011flamal\u0131s\u0131n\u0131z.<\/p>\n<h3>3. Performans ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>\u00d6zellikle b\u00fcy\u00fck veya s\u0131k\u00e7a i\u015flenen <code>.tt<\/code> dosyalar\u0131yla \u00e7al\u0131\u015f\u0131yorsan\u0131z, \u015fablon i\u015fleme s\u00fcrecinin performans\u0131 kritik hale gelebilir. Kendi yazd\u0131\u011f\u0131n\u0131z \u015fablon motorlar\u0131, yerle\u015fik ERB kadar optimize olmayabilir. Bu durumda:<\/p>\n<ul>\n<li>\u015eablonlar\u0131 \u00f6nceden derlemeyi (pre-compile) d\u00fc\u015f\u00fcn\u00fcn. E\u011fer \u015fablon i\u00e7eri\u011fi s\u0131k de\u011fi\u015fmiyorsa, her istekte yeniden ayr\u0131\u015ft\u0131rmak yerine, bir kez ayr\u0131\u015ft\u0131r\u0131p \u00f6nbelle\u011fe alabilirsiniz.<\/li>\n<li>Karma\u015f\u0131k mant\u0131\u011f\u0131 \u015fablondan Ruby koduna ta\u015f\u0131y\u0131n. \u015eablonlar genellikle sadece verileri sunmak i\u00e7in kullan\u0131lmal\u0131, i\u015f mant\u0131\u011f\u0131 i\u00e7erinmemelidir.<\/li>\n<li>Performans sorunlar\u0131 ya\u015f\u0131yorsan\u0131z, Ruby profiler ara\u00e7lar\u0131 (\u00f6rne\u011fin <code>stackprof<\/code>) ile \u015fablon i\u015fleme s\u00fcrecini analiz edin.<\/li>\n<\/ul>\n<h3>4. Test Edilebilirlik<\/h3>\n<p><code>.tt<\/code> dosyalar\u0131yla \u00fcretilen \u00e7\u0131kt\u0131lar\u0131n do\u011frulu\u011funu sa\u011flamak i\u00e7in birim ve entegrasyon testleri yazmak \u00f6nemlidir. \u015eablonun farkl\u0131 veri k\u00fcmeleriyle do\u011fru \u00e7\u0131kt\u0131 verdi\u011fini, kenar durumlar\u0131 (bo\u015f veriler, \u00f6zel karakterler) do\u011fru i\u015fledi\u011fini ve beklenmeyen hatalar \u00fcretmedi\u011fini do\u011frulay\u0131n. \u00d6rne\u011fin, bir test senaryosunda belirli girdilerle beklenen bir \u00e7\u0131kt\u0131y\u0131 kar\u015f\u0131la\u015ft\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-ruby\"># spec\/custom_template_processor_spec.rb\nrequire 'spec_helper'\nrequire_relative '..\/app\/services\/custom_template_processor' # \u0130\u015flemci s\u0131n\u0131f\u0131n\u0131z\u0131n yolu\n\nRSpec.describe CustomTemplateProcessor do\n  before(:all) do\n    # Test \u015fablon dosyas\u0131n\u0131 olu\u015ftur\n    File.write('test_template.tt', \"Merhaba <%= user_name %>, projeniz <%= project_name %>.\")\n  end\n\n  after(:all) do\n    # Test \u015fablon dosyas\u0131n\u0131 sil\n    File.delete('test_template.tt')\n  end\n\n  subject { CustomTemplateProcessor.new('test_template.tt') }\n\n  it 'do\u011fru verilerle \u015fablonu ba\u015far\u0131yla i\u015fler' do\n    data = { user_name: 'Ahmet', project_name: 'Proje A' }\n    expect(subject.render(data)).to eq('Merhaba Ahmet, projeniz Proje A.')\n  end\n\n  it 'eksik veriler i\u00e7in bo\u015f de\u011ferleri do\u011fru i\u015fler' do\n    data = { user_name: 'Zeynep' } # project_name eksik\n    expect(subject.render(data)).to eq('Merhaba Zeynep, projeniz .')\n  end\n\n  it '\u00f6zel karakterleri i\u015flerken hata vermez' do\n    data = { user_name: '\u00d6zel & Kullan\u0131c\u0131', project_name: 'Proje <B>' }\n    # E\u011fer g\u00fcvenli render metodu kullan\u0131l\u0131yorsa, \u00e7\u0131kt\u0131 ka\u00e7\u0131\u015fl\u0131 olacakt\u0131r\n    expect(subject.render(data)).to eq('Merhaba \u00d6zel & Kullan\u0131c\u0131, projeniz Proje <B>.')\n  end\nend\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ipu\u00e7lar\u0131, <code>.tt<\/code> dosyalar\u0131 gibi standart d\u0131\u015f\u0131 \u015fablonlama mekanizmalar\u0131n\u0131 Ruby projelerinizde daha y\u00f6netilebilir, g\u00fcvenli ve verimli hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Her zaman oldu\u011fu gibi, projenin \u00f6zel ihtiya\u00e7lar\u0131na ve ba\u011flam\u0131na g\u00f6re bu yakla\u015f\u0131mlar\u0131 uyarlamak en iyisidir.<\/p>\n<h3>Mobil Dostu \u015eablon \u00c7\u0131kt\u0131lar\u0131 \u0130\u00e7in HTML ve CSS Entegrasyonu (Media Query \u00d6rnekleri)<\/h3>\n<p>Bir \u015fablon motoru, hangi uzant\u0131ya sahip olursa olsun (<code>.tt<\/code>, <code>.erb<\/code>, vb.), nihayetinde bir \u00e7\u0131kt\u0131 \u00fcretir. Bu \u00e7\u0131kt\u0131 genellikle HTML format\u0131nda oldu\u011funda, modern web standartlar\u0131na uygun, yani mobil dostu ve duyarl\u0131 tasar\u0131ma sahip olmas\u0131 beklenir. \u015eablonlar, dinamik i\u00e7erik eklerken ayn\u0131 zamanda bu i\u00e7eri\u011fin farkl\u0131 cihaz boyutlar\u0131nda d\u00fczg\u00fcn g\u00f6r\u00fcnmesini sa\u011flayacak CSS ve HTML yap\u0131lar\u0131n\u0131 da i\u00e7ermelidir. Bu, \u015fablonun kendisinin de\u011fil, \u015fablon taraf\u0131ndan \u00fcretilen \u00e7\u0131kt\u0131n\u0131n sorumlulu\u011fudur.<\/p>\n<p>Duyarl\u0131 tasar\u0131m\u0131n temelini olu\u015fturan HTML etiketleri ve CSS medya sorgular\u0131 (media queries), \u015fablonlar arac\u0131l\u0131\u011f\u0131yla \u00fcretilen sayfalarda da rahatl\u0131kla kullan\u0131labilir. Amac\u0131m\u0131z, i\u00e7eri\u011fin her boyuttaki ekran i\u00e7in optimize edilmi\u015f bir kullan\u0131c\u0131 deneyimi sunmas\u0131d\u0131r. \u0130\u015fte \u015fablon \u00e7\u0131kt\u0131lar\u0131nda mobil uyumlulu\u011fu sa\u011flamak i\u00e7in kullanabilece\u011finiz baz\u0131 yakla\u015f\u0131mlar ve \u00f6rnekler:<\/p>\n<ul>\n<li><strong>Meta Viewport Etiketi:<\/strong> Her duyarl\u0131 HTML sayfas\u0131n\u0131n olmazsa olmaz\u0131d\u0131r. Bu etiket, taray\u0131c\u0131ya sayfan\u0131n cihaz geni\u015fli\u011fine \u00f6l\u00e7eklenmesini s\u00f6yler. \u015eablonunuzun <code><head><\/code> b\u00f6l\u00fcm\u00fcnde mutlaka yer almal\u0131d\u0131r.<\/li>\n<li><strong>Esnek Izgaralar (Flexible Grids):<\/strong> Sabit piksel de\u011ferleri yerine y\u00fczde (<code>%<\/code>) birimleri, <code>em<\/code>, <code>rem<\/code> veya <code>vw<\/code>\/<code>vh<\/code> gibi g\u00f6receli birimler kullanarak elemanlar\u0131n ekran boyutuna g\u00f6re esnemesini sa\u011flay\u0131n.<\/li>\n<li><strong>Medya Sorgular\u0131 (Media Queries):<\/strong> Belirli ekran geni\u015fliklerine ula\u015f\u0131ld\u0131\u011f\u0131nda farkl\u0131 CSS kurallar\u0131 uygulamak i\u00e7in kullan\u0131l\u0131r. Bu, mobil cihazlar i\u00e7in \u00f6zel stiller tan\u0131mlaman\u0131za olanak tan\u0131r.<\/li>\n<\/ul>\n<p>\u015eablonunuzdan \u00e7\u0131kan HTML'e nas\u0131l bir mobil uyumluluk entegre edebilece\u011finize dair basit bir \u00f6rnek:<\/p>\n<pre><code class=\"language-html\"><!-- template.tt veya .erb dosyas\u0131ndan \u00fcretilen HTML \u00e7\u0131kt\u0131s\u0131 -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title><%= @page_title %> - Mobil Uyumlu Sayfa<\/title>\n  <style>\n    \/* Genel stil kurallar\u0131 *\/\n    body {\n      font-family: Arial, sans-serif;\n      margin: 0;\n      padding: 20px;\n      background-color: #f4f4f4;\n    }\n    .container {\n      width: 90%; \/* Esnek geni\u015flik *\/\n      max-width: 960px;\n      margin: 0 auto;\n      background-color: #fff;\n      padding: 20px;\n      box-shadow: 0 0 10px rgba(0,0,0,0.1);\n    }\n    .header {\n      background-color: #333;\n      color: #fff;\n      padding: 10px;\n      text-align: center;\n    }\n    .content {\n      display: flex; \/* Flexbox kullan\u0131m\u0131 *\/\n      flex-wrap: wrap; \/* \u0130\u00e7erik ta\u015farsa alta ge\u00e7sin *\/\n      gap: 20px; \/* Elemanlar aras\u0131 bo\u015fluk *\/\n    }\n    .item {\n      flex: 1 1 300px; \/* Esnek eleman boyutu: b\u00fcy\u00fcyebilir, k\u00fc\u00e7\u00fclebilir, varsay\u0131lan geni\u015flik 300px *\/\n      background-color: #e9e9e9;\n      padding: 15px;\n      border-radius: 5px;\n    }\n\n    \/* Mobil i\u00e7in medya sorgular\u0131 *\/\n    @media (max-width: 768px) {\n      .container {\n        width: 95%;\n        padding: 10px;\n      }\n      .content {\n        flex-direction: column; \/* Mobil g\u00f6r\u00fcn\u00fcmde s\u00fctun d\u00fczeni *\/\n      }\n      .item {\n        flex: 1 1 100%; \/* Mobil cihazlarda her eleman tam geni\u015flik kaplas\u0131n *\/\n      }\n      .header h1 {\n        font-size: 1.5em;\n      }\n    }\n\n    @media (max-width: 480px) {\n      body {\n        padding: 10px;\n      }\n      .header {\n        padding: 5px;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"container\">\n    <header class=\"header\">\n      <h1><%= @page_title %><\/h1>\n      <p><%= @tagline %><\/p>\n    <\/header>\n    <main class=\"content\">\n      <div class=\"item\">\n        <h2>\u00d6\u011fe 1<\/h2>\n        <p>Bu, <%= @item1_desc %> ile ilgili bilgiler i\u00e7eren bir \u00f6\u011fedir.<\/p>\n      <\/div>\n      <div class=\"item\">\n        <h2>\u00d6\u011fe 2<\/h2>\n        <p>Bu da <%= @item2_desc %> hakk\u0131nda daha fazla bilgi sunar.<\/p>\n      <\/div>\n      <div class=\"item\">\n        <h2>\u00d6\u011fe 3<\/h2>\n        <p>Son olarak, <%= @item3_desc %> ile ilgili detaylar.<\/p>\n      <\/div>\n    <\/main>\n    <footer>\n      <p>T\u00fcm haklar\u0131 sakl\u0131d\u0131r \u00a9 <%= Time.now.year %><\/p>\n    <\/footer>\n  <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, dinamik i\u00e7erik (<code><%= ... %><\/code>) bir \u015fablondan (ister <code>.tt<\/code> ister ba\u015fka bir uzant\u0131 olsun) gelirken, CSS kurallar\u0131 ve medya sorgular\u0131, bu i\u00e7eri\u011fin farkl\u0131 ekran boyutlar\u0131na nas\u0131l uyum sa\u011flayaca\u011f\u0131n\u0131 belirliyor. <code>.tt<\/code> dosyalar\u0131n\u0131n do\u011frudan bir mobil uyumluluk \u00f6zelli\u011fi olmasa da, onlar\u0131n \u00fcretti\u011fi nihai HTML \u00e7\u0131kt\u0131s\u0131n\u0131n CSS ve modern web teknikleriyle nas\u0131l mobil dostu hale getirilebilece\u011fini bu \u015fekilde g\u00f6sterebiliriz. \u015eablonunuzu tasarlarken, bu duyarl\u0131 tasar\u0131m prensiplerini g\u00f6z \u00f6n\u00fcnde bulundurmak, t\u00fcm kullan\u0131c\u0131lara tutarl\u0131 ve eri\u015filebilir bir deneyim sunman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7: Ruby'de .tt Dosyalar\u0131n\u0131n Gizemi \u00c7\u00f6z\u00fcld\u00fc m\u00fc?<\/h2>\n<p>Bu makale boyunca, Ruby projelerinde <code>.tt<\/code> dosyalar\u0131n\u0131n ne anlama geldi\u011fi sorusuna kapsaml\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunmaya \u00e7al\u0131\u015ft\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, <code>.tt<\/code> uzant\u0131s\u0131 Ruby ekosisteminde standart bir \u015fablon format\u0131 de\u011fildir ve bu nedenle bir geli\u015ftiricinin kafas\u0131n\u0131 kar\u0131\u015ft\u0131rmas\u0131 olduk\u00e7a do\u011fald\u0131r. Ancak bu, onlar\u0131n bir Ruby projesinde var olamayaca\u011f\u0131 anlam\u0131na gelmez; aksine, genellikle projenin kendine \u00f6zg\u00fc ba\u011flam\u0131n\u0131, ge\u00e7mi\u015fini veya d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 yans\u0131tan \u00f6zel durumlar\u0131 i\u015faret ederler.<\/p>\n<p>\u00d6zetle, bir Ruby projesinde <code>.tt<\/code> dosyalar\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, genellikle \u00fc\u00e7 ana senaryodan birini d\u00fc\u015f\u00fcnebilirsiniz: projenin kendi i\u00e7inde geli\u015ftirilmi\u015f basit bir \u015fablon motorunun par\u00e7as\u0131 olabilirler, \u00f6zellikle Perl'in Template Toolkit gibi d\u0131\u015f ara\u00e7larla bir entegrasyonu temsil edebilirler veya kod \u00fcretimi yapan bir jenerat\u00f6r\u00fcn (scaffolding) dahili \u015fablonlar\u0131 olarak kullan\u0131labilirler. Her durumda, bu dosyalar\u0131n nas\u0131l i\u015flendi\u011fini anlamak i\u00e7in kod taban\u0131n\u0131 dikkatlice incelemek, ili\u015fkili gemleri ve \u00f6zel i\u015fleme mant\u0131\u011f\u0131n\u0131 ara\u015ft\u0131rmak esast\u0131r. G\u00fcvenlik, performans ve belgeleme gibi konular\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak, <code>.tt<\/code> dosyalar\u0131n\u0131 dahi projelerinizde verimli bir \u015fekilde y\u00f6netebilirsiniz. Unutmay\u0131n, Ruby'nin esnekli\u011fi, standart olmayan yakla\u015f\u0131mlara dahi kap\u0131 aralar; \u00f6nemli olan, bu yakla\u015f\u0131mlar\u0131 bilin\u00e7li ve kontroll\u00fc bir \u015fekilde uygulamakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>Q: Ruby'de .tt dosyas\u0131 standart bir \u015fablon motoru uzant\u0131s\u0131 m\u0131d\u0131r?<\/strong><\/dt>\n<dd><strong>A:<\/strong> Hay\u0131r, <code>.tt<\/code> uzant\u0131s\u0131 Ruby ekosisteminde ERB, Haml veya Slim gibi standart bir \u015fablon motoru uzant\u0131s\u0131 de\u011fildir. Genellikle Perl'in Template Toolkit gibi harici sistemlerle veya projenin kendi \u00f6zel \u015fablon \u00e7\u00f6z\u00fcmleriyle ili\u015fkilidir.<\/dd>\n<dt><strong>Q: Bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131mda ilk ne yapmal\u0131y\u0131m?<\/strong><\/dt>\n<dd><strong>A:<\/strong> \u00d6ncelikle projenin kod taban\u0131nda (\u00f6zellikle <code>lib\/<\/code> klas\u00f6r\u00fcnde ve <code>Gemfile<\/code>'da) <code>.tt<\/code> uzant\u0131s\u0131n\u0131 okuyan veya i\u015fleyen kod par\u00e7ac\u0131klar\u0131n\u0131 aramal\u0131s\u0131n\u0131z. Bu, dosyan\u0131n hangi ba\u011flamda kullan\u0131ld\u0131\u011f\u0131n\u0131 ve hangi motor taraf\u0131ndan i\u015flendi\u011fini anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/dd>\n<dt><strong>Q: .tt dosyalar\u0131n\u0131 i\u015flemek i\u00e7in Ruby'de hangi gemi kullanabilirim?<\/strong><\/dt>\n<dd><strong>A:<\/strong> <code>.tt<\/code> dosyalar\u0131 i\u00e7in do\u011frudan bir \"Ruby gemi\" genellikle yoktur, \u00e7\u00fcnk\u00fc uzant\u0131 standart de\u011fildir. E\u011fer dosya i\u00e7eri\u011fi ERB benzeri ise, Ruby'nin yerle\u015fik <code>ERB<\/code> s\u0131n\u0131f\u0131n\u0131 kullanabilirsiniz. E\u011fer Perl Template Toolkit format\u0131ndaysa, Ruby \u00fczerinden Perl beti\u011fini \u00e7a\u011f\u0131rarak veya \u00e7\u0131kt\u0131lar\u0131n\u0131 i\u015fleyerek entegrasyon sa\u011flaman\u0131z gerekebilir.<\/dd>\n<dt><strong>Q: .tt dosyalar\u0131 g\u00fcvenlik a\u00e7\u0131\u011f\u0131 olu\u015fturur mu?<\/strong><\/dt>\n<dd><strong>A:<\/strong> Herhangi bir \u015fablonlama mekanizmas\u0131 gibi, <code>.tt<\/code> dosyalar\u0131n\u0131 kullan\u0131c\u0131dan al\u0131nan verilerle i\u015flerken g\u00fcvenlik a\u00e7\u0131klar\u0131 riski vard\u0131r. \u00d6zellikle \"ev yap\u0131m\u0131\" \u00e7\u00f6z\u00fcmlerde \u00e7\u0131kt\u0131 ka\u00e7\u0131\u015f\u0131 (output escaping) ve girdi do\u011frulamas\u0131 gibi g\u00fcvenlik \u00f6nlemlerini manuel olarak uygulaman\u0131z \u00f6nemlidir. Harici bir sistem kullan\u0131l\u0131yorsa, o sistemin g\u00fcvenlik y\u00f6nergelerine uyun.<\/dd>\n<dt><strong>Q: .tt dosyalar\u0131 ve ERB \u015fablonlar\u0131 aras\u0131ndaki temel fark nedir?<\/strong><\/dt>\n<dd><strong>A:<\/strong> Temel fark uzant\u0131 ve genellikle ili\u015fkili olduklar\u0131 ekosistemdir. ERB (.erb uzant\u0131s\u0131 ile) Ruby'nin yerle\u015fik ve yayg\u0131n \u015fablon motorudur. <code>.tt<\/code> ise Ruby'ye \u00f6zg\u00fc de\u011fildir; genellikle Perl Template Toolkit veya projenin \u00f6zel bir kullan\u0131m\u0131n\u0131 ifade eder. Ancak, baz\u0131 durumlarda bir <code>.tt<\/code> dosyas\u0131 ERB s\u00f6zdizimiyle yaz\u0131lm\u0131\u015f olabilir ve Ruby'nin ERB motoru taraf\u0131ndan i\u015flenebilir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen &#8220;Bu da neyin nesi?&#8221; oluyor, de\u011fil mi?&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":[1],"tags":[],"class_list":{"0":"post-33660","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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 Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?<\/title>\n<meta name=\"description\" content=\"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen &quot;Bu da neyin nesi?&quot; oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby&#039;nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\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\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen &quot;Bu da neyin nesi?&quot; oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby&#039;nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\u011f\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-05T13:01:59+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=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?\",\"datePublished\":\"2025-11-05T13:01:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\"},\"wordCount\":3671,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\",\"name\":\"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-05T13:01:59+00:00\",\"description\":\"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen \\\"Bu da neyin nesi?\\\" oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby'nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\u011f\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?\"}]},{\"@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 Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?","description":"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen \"Bu da neyin nesi?\" oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby'nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\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\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?","og_description":"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen \"Bu da neyin nesi?\" oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby'nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\u011f\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-05T13:01:59+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?","datePublished":"2025-11-05T13:01:59+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/"},"wordCount":3671,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/","url":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/","name":"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-05T13:01:59+00:00","description":"Ruby projelerinde bir .tt dosyas\u0131yla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda akl\u0131n\u0131zda beliren ilk soru muhtemelen \"Bu da neyin nesi?\" oluyor, de\u011fil mi? Zira bu uzant\u0131, Ruby'nin yerle\u015fik veya yayg\u0131n \u015fablon motorlar\u0131yla pek ili\u015fkilendirilmez. Peki, bu gizemli dosyalar asl\u0131nda ne i\u015fe yar\u0131yor ve bir Ruby geli\u015ftiricisi olarak onlarla nas\u0131l ba\u015fa \u00e7\u0131kmal\u0131s\u0131n\u0131z? Bu kapsaml\u0131 rehberde, .tt dosyalar\u0131n\u0131n ard\u0131ndaki s\u0131r perdesini aralayacak, Ruby d\u00fcnyas\u0131ndaki olas\u0131 rollerini ke\u015ffedecek ve bu t\u00fcr durumlarla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda size yol g\u00f6sterecek pratik bilgiler sunaca\u011f\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ruby-projelerinde-tt-dosyalari-gercekten-nelerdir-ve-nasil-kullanilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby Projelerinde .tt Dosyalar\u0131: Ger\u00e7ekten Nelerdir ve Nas\u0131l Kullan\u0131l\u0131r?"}]},{"@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\/33660","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=33660"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33660\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}