Ruby on Railsのビュー(ERBテンプレート)では、Rubyの条件分岐構文をそのまま使用できます。ユーザーのログイン状態に応じて表示を切り替えたり、データの有無で異なるメッセージを表示したりと、動的なWebページを構築する上で条件分岐は欠かせない機能です。この記事では、ビュー内での条件分岐の書き方と実践的な使用例を解説します。
基本的な使い方
ERBテンプレートでは、<% %>タグの中にRubyコードを記述できます。if文を使った基本的な条件分岐は以下のように書きます。
<% if @user.present? %>
<p>ようこそ、<%= @user.name %>さん</p>
<% else %>
<p>ゲストとしてアクセスしています</p>
<% end %><% %>はRubyコードを実行するだけで出力はしません。<%= %>はコードの実行結果をHTMLに出力します。条件分岐のif、elsif、else、endは出力が不要なので<% %>を使います。
if / elsif / elseの使い方
複数の条件で分岐する場合は、elsifを使います。
<% status = 1 %>
<% if status == 0 %>
<div class="badge badge-secondary">下書き</div>
<% elsif status == 1 %>
<div class="badge badge-success">公開中</div>
<% elsif status == 2 %>
<div class="badge badge-warning">レビュー中</div>
<% else %>
<div class="badge badge-danger">不明なステータス</div>
<% end %>上記の例では、status変数の値に応じて異なるバッジを表示しています。実際のアプリケーションでは、コントローラーから渡されたインスタンス変数(@post.statusなど)を条件に使うのが一般的です。
unless文を使った条件分岐
unlessはifの逆で、条件が偽の場合に処理を実行します。「〜でないとき」という条件を表現したい場合に読みやすいコードになります。
<% unless @user.logged_in? %>
<div class="alert alert-info">
<p>ログインすると、すべての機能をご利用いただけます。</p>
<a href="/login">ログインはこちら</a>
</div>
<% end %>上記は「ユーザーがログインしていない場合にログイン案内を表示する」という処理です。if !@user.logged_in?と書くよりも、unlessを使った方が意図が明確になります。
unlessはelsifやelseと組み合わせることもできますが、条件が複雑になる場合はifを使った方が読みやすくなります。unlessはシンプルな否定条件に限定して使いましょう。
三項演算子でインラインの条件分岐
簡単な条件分岐であれば、三項演算子を使って1行で書くことができます。HTMLタグの属性値やテキストの出し分けに便利です。
<p><%= @user.admin? ? "管理者" : "一般ユーザー" %></p>
<div class="<%= @post.published? ? 'published' : 'draft' %>">
<%= @post.title %>
</div>
<%= link_to "プロフィール", profile_path, class: (@current_page == "profile" ? "active" : "") %>三項演算子は条件 ? 真の場合の値 : 偽の場合の値という形式で書きます。CSSクラスの切り替えやリンクテキストの変更など、短い条件分岐に適しています。
実践的な使用例
実際のアプリケーションでは、以下のような場面で条件分岐を使います。
<!-- データの有無で表示を切り替え -->
<% if @posts.any? %>
<% @posts.each do |post| %>
<div class="post-card">
<h2><%= post.title %></h2>
<p><%= truncate(post.content, length: 100) %></p>
</div>
<% end %>
<% else %>
<div class="empty-state">
<p>まだ投稿がありません。</p>
<%= link_to "最初の投稿を作成", new_post_path %>
</div>
<% end %>
<!-- 権限に応じたボタン表示 -->
<% if current_user == @post.author %>
<%= link_to "編集", edit_post_path(@post), class: "btn btn-primary" %>
<%= link_to "削除", @post, method: :delete, class: "btn btn-danger" %>
<% end %>データが存在するかどうかの確認には.any?や.present?、.blank?といったメソッドを活用しましょう。Railsはこれらの便利メソッドを提供しており、nil安全なコードを書くことができます。
ビューに複雑なロジック(多段階のif文やビジネスロジック)を書くのは避けましょう。条件が複雑な場合は、ヘルパーメソッドやデコレーターに処理を移動して、ビューをシンプルに保つことが重要です。
まとめ
<% if 条件 %> ... <% end %>でビュー内の条件分岐を実装するelsifとelseで複数条件の分岐に対応できるunlessは条件が偽の場合に処理を実行する(シンプルな否定条件向け)- 三項演算子(
条件 ? 真 : 偽)でインラインの条件分岐が書ける .present?、.blank?、.any?でデータの有無を安全に確認する- 複雑なロジックはヘルパーメソッドに移動してビューをシンプルに保つ