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 %>
|
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 %>
|
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ç#
Bu ERB en iyi uygulamalarını takip etmek şablonlarınızı daha sürdürülebilir, güvenli ve debug etmesi kolay hale getirir. View’ları basit tutmayı ve karmaşık mantığı helper’lara veya model’lere taşımayı unutmayın.