基本

Ruby on Railsのヘルパーメソッドの定義と使い方

Ruby on Railsのヘルパーメソッドは、ビューで使用する補助的なメソッドを定義する仕組みです。HTMLの生成ロジックやフォーマット処理をビューから切り出すことで、テンプレートをすっきりと保てます。Railsには組み込みのヘルパーメソッドが多数用意されていますが、独自のヘルパーを定義することも簡単です。この記事では、ヘルパーメソッドの定義方法と活用法を解説します。

基本的な使い方

コントローラーで定義したメソッドをhelper_methodで宣言すると、ビュー内でもそのメソッドを呼び出せるようになります。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  helper_method :current_user

  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end
end
app/views/layouts/application.html.erb
<% if current_user %>
  <p>ようこそ、<%= current_user.name %>さん</p>
<% else %>
  <%= link_to "ログイン", login_path %>
<% end %>

helper_methodで宣言したメソッドは、コントローラーとビューの両方で使用できるようになります。ログインユーザーの取得のように、両方で参照するメソッドに最適です。

ヘルパーファイルに定義する

ビュー専用のヘルパーは、app/helpers/ディレクトリのヘルパーファイルに定義するのが一般的です。

app/helpers/application_helper.rb
module ApplicationHelper
  def page_title(title = "")
    base_title = "MyApp"
    title.present? ? "#{title} | #{base_title}" : base_title
  end

  def format_date(date)
    date.strftime("%Y年%m月%d日")
  end

  def status_badge(status)
    case status
    when "published"
      content_tag(:span, "公開中", class: "badge badge-success")
    when "draft"
      content_tag(:span, "下書き", class: "badge badge-secondary")
    when "archived"
      content_tag(:span, "アーカイブ", class: "badge badge-warning")
    end
  end
end
app/views/layouts/application.html.erb
<head>
  <title><%= page_title(@title) %></title>
</head>

ApplicationHelperに定義したメソッドはすべてのビューで使用できます。コントローラーごとのヘルパーファイル(例: posts_helper.rb)に定義すると、そのコントローラーのビューで使えます。

コントローラー固有のヘルパー

特定のコントローラーに関連するヘルパーは、対応するヘルパーファイルに定義します。

app/helpers/posts_helper.rb
module PostsHelper
  def post_summary(post, length: 150)
    truncate(strip_tags(post.content), length: length)
  end

  def reading_time(post)
    words = post.content.length
    minutes = (words / 400.0).ceil
    "#{minutes}分で読めます"
  end
end
app/views/posts/index.html.erb
<% @posts.each do |post| %>
  <div class="post-card">
    <h2><%= post.title %></h2>
    <p><%= post_summary(post) %></p>
    <small><%= reading_time(post) %></small>
  </div>
<% end %>

Rails組み込みのヘルパーメソッド

Railsには便利な組み込みヘルパーが多数用意されています。

app/views/posts/show.html.erb
<!-- リンク生成 -->
<%= link_to "ホーム", root_path, class: "nav-link" %>

<!-- 数値のフォーマット -->
<%= number_to_currency(1500, unit: "円", format: "%n%u") %>
<!-- 出力: 1,500円 -->

<!-- 時間の表示 -->
<%= time_ago_in_words(@post.created_at) %>
<!-- 出力: 3日前 -->

<!-- テキストの切り詰め -->
<%= truncate(@post.content, length: 100) %>

<!-- HTMLタグの安全な出力 -->
<%= simple_format(@post.content) %>
ポイント

ヘルパーメソッドにはHTMLを返すものも多くあります。content_tagメソッドを使えば、安全にHTMLタグを生成できます。文字列でHTMLを組み立てるよりもcontent_tagの使用が推奨されます。

注意

ヘルパーメソッドにビジネスロジックを書くのは避けてください。ヘルパーはあくまで表示に関する処理(フォーマット、HTML生成など)に限定し、データの加工やビジネスルールはモデルやService Objectに記述しましょう。

まとめ

  • helper_methodでコントローラーのメソッドをビューから呼び出せるようにする
  • app/helpers/ディレクトリにヘルパーモジュールを定義する
  • ApplicationHelperはすべてのビューで使用可能
  • Railsの組み込みヘルパー(link_tonumber_to_currency等)を活用する
  • content_tagで安全にHTMLタグを生成する
  • ヘルパーは表示ロジックに限定し、ビジネスロジックはモデルに書く