基本

Ruby on Railsのビューで条件分岐を使う

Ruby on Railsのビュー(ERBテンプレート)では、Rubyの条件分岐構文をそのまま使用できます。ユーザーのログイン状態に応じて表示を切り替えたり、データの有無で異なるメッセージを表示したりと、動的なWebページを構築する上で条件分岐は欠かせない機能です。この記事では、ビュー内での条件分岐の書き方と実践的な使用例を解説します。

基本的な使い方

ERBテンプレートでは、<% %>タグの中にRubyコードを記述できます。if文を使った基本的な条件分岐は以下のように書きます。

app/views/posts/index.html.erb
<% if @user.present? %>
  <p>ようこそ、<%= @user.name %>さん</p>
<% else %>
  <p>ゲストとしてアクセスしています</p>
<% end %>

<% %>はRubyコードを実行するだけで出力はしません。<%= %>はコードの実行結果をHTMLに出力します。条件分岐のifelsifelseendは出力が不要なので<% %>を使います。

if / elsif / elseの使い方

複数の条件で分岐する場合は、elsifを使います。

app/views/posts/index.html.erb
<% 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文を使った条件分岐

unlessifの逆で、条件が偽の場合に処理を実行します。「〜でないとき」という条件を表現したい場合に読みやすいコードになります。

app/views/posts/index.html.erb
<% unless @user.logged_in? %>
  <div class="alert alert-info">
    <p>ログインすると、すべての機能をご利用いただけます。</p>
    <a href="/login">ログインはこちら</a>
  </div>
<% end %>

上記は「ユーザーがログインしていない場合にログイン案内を表示する」という処理です。if !@user.logged_in?と書くよりも、unlessを使った方が意図が明確になります。

ポイント

unlesselsifelseと組み合わせることもできますが、条件が複雑になる場合はifを使った方が読みやすくなります。unlessはシンプルな否定条件に限定して使いましょう。

三項演算子でインラインの条件分岐

簡単な条件分岐であれば、三項演算子を使って1行で書くことができます。HTMLタグの属性値やテキストの出し分けに便利です。

app/views/posts/index.html.erb
<p><%= @user.admin? ? "管理者" : "一般ユーザー" %></p>

<div class="<%= @post.published? ? 'published' : 'draft' %>">
  <%= @post.title %>
</div>

<%= link_to "プロフィール", profile_path, class: (@current_page == "profile" ? "active" : "") %>

三項演算子は条件 ? 真の場合の値 : 偽の場合の値という形式で書きます。CSSクラスの切り替えやリンクテキストの変更など、短い条件分岐に適しています。

実践的な使用例

実際のアプリケーションでは、以下のような場面で条件分岐を使います。

app/views/posts/index.html.erb
<!-- データの有無で表示を切り替え -->
<% 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 %>でビュー内の条件分岐を実装する
  • elsifelseで複数条件の分岐に対応できる
  • unlessは条件が偽の場合に処理を実行する(シンプルな否定条件向け)
  • 三項演算子(条件 ? 真 : 偽)でインラインの条件分岐が書ける
  • .present?.blank?.any?でデータの有無を安全に確認する
  • 複雑なロジックはヘルパーメソッドに移動してビューをシンプルに保つ