Rails Performans İpuçları: Uygulamanızı Optimize Edin

Rails Performans İpuçları Rails’teki performans sorunları neredeyse her zaman aynı birkaç şeye çıkar: sorgular, önbellekleme ve background’da çalışması gereken işler. 1. Veritabanı Sorgu Optimizasyonu N+1 Sorgu Problemini Önlemek için Includes Kullanın 1 2 3 4 5 6 7 8 9 10 11 12 {title="app/controllers/users_controller.rb" hl_lines=[8]} # Kötü - N+1 sorgu problemi users = User.all users.each do |user| puts user.posts.count end # İyi - Includes kullanın users = User.includes(:posts) # Bu satır N+1 sorgu problemini önler users.each do |user| puts user.posts.count end Veritabanı İndekslerini Kullanın 1 2 3 4 5 6 7 # Migration dosyanızda class AddIndexToUsers < ActiveRecord::Migration[7.0] def change add_index :users, :email add_index :posts, [:user_id, :created_at] end end 2. Önbellekleme Stratejileri Fragment Önbellekleme 1 2 3 4 5 6 7 <!-- View dosyanızda --> <% cache(post, expires_in: 1.hour) do %> <div class="post"> <h2><%= post.title %></h2> <p><%= post.content %></p> </div> <% end %> Action Önbellekleme 1 2 3 4 5 6 7 class PostsController < ApplicationController caches_action :index, expires_in: 1.hour def index @posts = Post.published.includes(:author) end end 3. Arka Plan İşleri Ağır işlemler için arka plan işlerini kullanın: ...

Temmuz 7, 2025 · 2 dk · 248 sözcük · Okan Binli

Modern JavaScript Async Kalıpları

Modern JavaScript Async Kalıpları JavaScript’in asenkron doğası zor olabilir. Async işlemleri etkili şekilde yönetmek için modern kalıpları keşfedelim. Promise Tabanlı Kalıplar Temel Promise Kullanımı 1 2 3 4 5 6 7 8 9 10 11 12 function fetchUser(id) { return fetch(`/api/users/${id}`) .then(response => response.json()) .then(user => { console.log('Kullanıcı yüklendi:', user); return user; }) .catch(error => { console.error('Kullanıcı yükleme hatası:', error); throw error; }); } Async/Await Kalıbı 1 2 3 4 5 6 7 8 9 10 11 async function fetchUser(id) { try { const response = await fetch(`/api/users/${id}`); const user = await response.json(); console.log('Kullanıcı yüklendi:', user); return user; } catch (error) { console.error('Kullanıcı yükleme hatası:', error); throw error; } } Gelişmiş Kalıplar Paralel Çalıştırma 1 2 3 4 5 6 7 8 9 10 async function fetchMultipleUsers(ids) { try { const promises = ids.map(id => fetchUser(id)); const users = await Promise.all(promises); return users; } catch (error) { console.error('Kullanıcıları yükleme hatası:', error); throw error; } } Promise.allSettled ile Hata Yönetimi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 async function fetchUsersWithResults(ids) { const promises = ids.map(id => fetchUser(id)); const results = await Promise.allSettled(promises); const successful = results .filter(result => result.status === 'fulfilled') .map(result => result.value); const failed = results .filter(result => result.status === 'rejected') .map(result => result.reason); return { successful, failed }; } Şablon Entegrasyonu Handlebars ile Kullanım 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 {{! user-card.hbs }} <div class="user-card" data-user-id="{{id}}"> <h3>{{name}}</h3> <p>{{email}}</p> <button onclick="loadUserDetails({{id}})">Detayları Yükle</button> </div> <script> async function loadUserDetails(userId) { try { const user = await fetchUser(userId); updateUserCard(user); } catch (error) { showError('Kullanıcı detayları yüklenemedi'); } } </script> Sonuç Doğru kalıbı, önemediğiniz hata türüne göre seçin: her şeyin birlikte başarısız olması gerekiyorsa Promise.all, kısmi sonuç hâlâ işinize yarıyorsa Promise.allSettled. ...

Haziran 30, 2025 · 2 dk · 296 sözcük · Okan Binli

ERB Şablonları: En İyi Uygulamalar ve İpuçları

ERB Şablonları: En İyi Uygulamalar ve İpuçları ERB (Embedded Ruby), Rails için varsayılan şablon motorudur. Temiz ve sürdürülebilir ERB şablonları yazma en iyi uygulamaları: 1. Mantığı View’lardan Uzak Tutun Kötü Örnek 1 2 3 4 5 6 7 8 9 10 11 12 <!-- Bunu yapmayın --> <% if user.admin? && user.active? && user.posts.count > 0 %> <div class="admin-panel"> <% user.posts.each do |post| %> <% if post.published? && post.created_at > 1.week.ago %> <div class="recent-post"> <%= post.title %> </div> <% end %> <% end %> </div> <% end %> İyi Örnek 1 2 3 4 5 6 <!-- Helper'ları ve model method'larını kullanın --> <% if show_admin_panel?(user) %> <div class="admin-panel"> <%= render 'admin/recent_posts', posts: user.recent_published_posts %> </div> <% end %> 1 2 3 4 5 6 7 8 9 # Helper'da def show_admin_panel?(user) user.admin? && user.active? && user.posts.any? end # User model'inde def recent_published_posts posts.published.where('created_at > ?', 1.week.ago) end 2. Yeniden Kullanılabilir Bileşenler için Partial’ları Kullanın Modüler Bileşenler Oluşturun 1 2 3 4 5 6 7 8 9 10 11 <!-- _user_card.html.erb --> <div class="user-card"> <div class="user-avatar"> <%= image_tag user.avatar.present? ? user.avatar : 'default-avatar.png' %> </div> <div class="user-info"> <h3><%= user.name %></h3> <p><%= user.email %></p> <span class="user-role"><%= user.role.humanize %></span> </div> </div> 1 2 3 4 5 6 <!-- Partial'ı kullanın --> <div class="users-grid"> <% @users.each do |user| %> <%= render 'user_card', user: user %> <% end %> </div> 3. HTML Güvenliği ve Kaçırma Doğru HTML Kaçırma 1 2 3 4 5 6 7 8 9 10 11 12 <!-- Varsayılan olarak güvenli --> <p>Kullanıcı yorumu: <%= @comment.content %></p> <!-- Ham HTML gerektiğinde (dikkatli olun!) --> <div class="content"> <%= raw @post.html_content %> </div> <!-- Sanitizasyon ile daha iyi yaklaşım --> <div class="content"> <%= sanitize @post.content, tags: %w[p br strong em ul ol li] %> </div> Dinamik HTML için content_tag Kullanma 1 2 3 4 5 6 7 8 9 10 # Helper'da def status_badge(status) css_class = case status when 'active' then 'badge-success' when 'pending' then 'badge-warning' else 'badge-default' end content_tag :span, status.humanize, class: "badge #{css_class}" end 1 2 <!-- Şablonda --> <%= status_badge(user.status) %> 4. Koşullu Rendering Temiz Koşullu Mantık 1 2 3 4 5 6 7 8 9 10 <!-- İyi --> <%= content_tag :div, class: "user-status #{'active' if user.active?}" do %> <span><%= user.name %></span> <% if user.admin? %> <span class="admin-badge">Admin</span> <% end %> <% end %> <!-- Helper ile daha iyi --> <%= render 'user_status', user: user %> 5. Form En İyi Uygulamaları Anlamsal Form Yapısı 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <%= form_with model: @user, local: true do |form| %> <div class="form-group"> <%= form.label :name %> <%= form.text_field :name, class: 'form-control' %> <%= form.error_span :name %> </div> <div class="form-group"> <%= form.label :email %> <%= form.email_field :email, class: 'form-control' %> <%= form.error_span :email %> </div> <div class="form-actions"> <%= form.submit 'Kullanıcıyı Kaydet', class: 'btn btn-primary' %> <%= link_to 'İptal', users_path, class: 'btn btn-secondary' %> </div> <% end %> Özel Form Helper’ı 1 2 3 4 5 6 7 8 9 # application_helper.rb'de module ApplicationHelper def form_error_span(form, field) if form.object.errors[field].any? content_tag :span, form.object.errors[field].first, class: 'error-message' end end end Sonuç View’ları basit tutun ve karmaşık mantığı helper’lara ya da model’lere taşıyın. Şablonlar debug etmesi kolaylaşır, testleri de yazması. ...

Mayıs 27, 2025 · 3 dk · 536 sözcük · Okan Binli

Yeni yazılardan haberdar ol

Okumaya değer bir şey yayınladığımda kısa bir e-posta gönderiyorum. Dilediğiniz zaman çıkabilirsiniz.