ERB 기본 출력 문법
<% %> : Ruby 코드 실행 (출력 없음)
<% if user.admin? %>
<p>관리자입니다</p>
<% end %>
<%= %> : Ruby 코드 실행 + 결과 출력
<p><%= user.name %></p>
<%# %> : ERB 주석
<%# 이 코드는 렌더링되지 않음 %>
제어문 (조건 / 반복)
<% if @posts.any? %>
<p>게시글 있음</p>
<% else %>
<p>게시글 없음</p>
<% end %>
<% @posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
<% for post in @posts %>
<%= post.title %>
<% end %>
Partial 렌더링 (render)
<%= render "shared/header" %>
_shared/header.erb
<%= render @posts %>
단축법
<%= render partial: "post", collection: @posts, as: :item %>
<%= render "card", title: "공지", body: "내용" %>
local
레이아웃
<%= yield %>
app/views/layouts/application.html.erb
<%= yield :sidebar %>
view 파일에서 지정하기
<% content_for :sidebar do %>
<p>사이드바</p>
<% end %>
View Helper
<%= link_to "홈", root_path %>
<%= form_with model: @post do |f| %>
<%= f.text_field :title %>
<% end %>
<div class="<%= "active" if current_page?(root_path) %>">
HTML 출력하기
<%= @content %>
<%= @content.html_safe %>
변수 사용
<%= @user.name %>
Rails 전용 View 키워드
local_assigns
선택적 locals 처리 (Partial 방어 코드)
<%= render "card", title: "공지사항" do %>
<p>공지 내용입니다.</p>
<% end %>
<div class="card">
<% if local_assigns[:title] %>
<h3><%= title %></h3>
<% end %>
<div class="card-body">
<%= yield %>
</div>
</div>
capture
View의 블록 내용을 변수로 저장
<% header = capture do %>
<h1>게시글 제목</h1>
<p class="sub">부제목</p>
<% end %>
<%= render "layout", header: header do %>
<p>본문 내용</p>
<% end %>
<div class="layout">
<header>
<%= header %>
</header>
<main>
<%= yield %>
</main>
</div>
capture + local_assigns 조합 패턴
옵션 영역이 있는 레이아웃
<div class="panel">
<% if local_assigns[:toolbar] %>
<div class="toolbar">
<%= toolbar %>
</div>
<% end %>
<div class="content">
<%= yield %>
</div>
</div>
<% tools = capture do %>
<%= link_to "수정", edit_post_path(@post) %>
<%= link_to "삭제", @post, method: :delete %>
<% end %>
<%= render "panel", toolbar: tools do %>
<p>게시글 내용</p>
<% end %>
- local_assigns는 “이 옵션이 넘어왔나?”
- capture는 “이 블록을 나중에 쓰자”
- 둘을 조합하면 ERB에서도 컴포넌트 설계가 가능해진다
Turbo / Hotwire 관련 (ERB에서 자주 등장)
<%= turbo_frame_tag "posts" do %>
...
<% end %>
<%= turbo_stream.append "posts", partial: "post", locals: { post: @post } %>
반응형