Ruby on Railsのヘルパーメソッドは、ビューで使用する補助的なメソッドを定義する仕組みです。HTMLの生成ロジックやフォーマット処理をビューから切り出すことで、テンプレートをすっきりと保てます。Railsには組み込みのヘルパーメソッドが多数用意されていますが、独自のヘルパーを定義することも簡単です。この記事では、ヘルパーメソッドの定義方法と活用法を解説します。
基本的な使い方
コントローラーで定義したメソッドをhelper_methodで宣言すると、ビュー内でもそのメソッドを呼び出せるようになります。
class ApplicationController < ActionController::Base
helper_method :current_user
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
end<% if current_user %>
<p>ようこそ、<%= current_user.name %>さん</p>
<% else %>
<%= link_to "ログイン", login_path %>
<% end %>helper_methodで宣言したメソッドは、コントローラーとビューの両方で使用できるようになります。ログインユーザーの取得のように、両方で参照するメソッドに最適です。
ヘルパーファイルに定義する
ビュー専用のヘルパーは、app/helpers/ディレクトリのヘルパーファイルに定義するのが一般的です。
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<head>
<title><%= page_title(@title) %></title>
</head>ApplicationHelperに定義したメソッドはすべてのビューで使用できます。コントローラーごとのヘルパーファイル(例: 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<% @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には便利な組み込みヘルパーが多数用意されています。
<!-- リンク生成 -->
<%= 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_to、number_to_currency等)を活用する content_tagで安全にHTMLタグを生成する- ヘルパーは表示ロジックに限定し、ビジネスロジックはモデルに書く