概要
- 「ヘルパーメソッドってどう便利なの?」
- 「ヘルパーメソッドってどこで使えるの?」
こんな疑問を持った方向けの記事です。
ヘルパーメソッドは何のために作られるか
ビューの繰り返し処理を共通化するためです。
例えば、ページタイトルの表示が複数のビューに出てくる場合:
Before(共通化なし)
<!-- 複数のビューでベタ書き -->
<!-- app/views/home/index.html.erb -->
<title>ホーム | sampleアプリ</title>
<!-- app/views/posts/index.html.erb -->
<title>投稿一覧 | sampleアプリ</title>
<!-- app/views/users/new.html.erb -->
<title>ユーザー登録 | sampleアプリ</title>
After(ヘルパーで共通化)
# app/helpers/application_helper.rb
module ApplicationHelper
# ページごとの完全なタイトルを返す
def full_title(page_title)
base_title = "sampleアプリ"
"#{page_title} | #{base_title}"
end
end
<!-- どのビューでもシンプルに -->
<!-- app/views/home/index.html.erb -->
<title><%= full_title("ホーム") %></title>
<!-- app/views/posts/index.html.erb -->
<title><%= full_title("投稿一覧") %></title>
<!-- app/views/users/new.html.erb -->
<title><%= full_title("ユーザー登録") %></title>
ヘルパーメソッドはどの範囲で使えるのか
ApplicationHelperで定義した場合
app/helpers/application_helper.rbで定義したメソッドは全てのビューで使用可能
# app/helpers/application_helper.rb
module ApplicationHelper
def full_title(page_title)
base_title = "sampleアプリ"
"#{page_title} | #{base_title}"
end
end
→アプリケーション全体のどのビューからでも<%= full_title("ページ名") %>
で使える
コントローラー固有のヘルパーで定義した場合
そのコントローラーから呼び出されるビューで使用する想定
例:app/views/posts/show.html.erbで使えれば良い→app/helpers/posts_helper.rbで定義
# app/helpers/posts_helper.rb
module PostsHelper
def post_status_badge(status)
case status
when 'published'
'<span class="badge success">公開</span>'.html_safe
when 'draft'
'<span class="badge secondary">下書き</span>'.html_safe
end
end
end
→ 主にposts
コントローラーのビューで使用する想定
重要な注意点
実は、コントローラー固有のヘルパーもどこからでも呼び出すことは可能です。
例:app/helpers/posts_helper.rbで定義→app/views/users/show.html.erbでも使える。
<!-- app/views/users/show.html.erbでも使える -->
<%= post_status_badge(@user.status) %>
なぜ?
- ヘルパーの実態はmodule
- Railsが
app/helpers/
内の全moduleを自動的にincludeしてくれる - 開発者が手動でincludeする必要はない
ただし、どういう用途で作られたかを明確にするためにposts_helper.rb
のような個別ファイルが作られています。
-
application_helper.rb
→ 全体で使う汎用メソッド -
posts_helper.rb
→ 投稿機能に関連するメソッド -
users_helper.rb
→ ユーザー機能に関連するメソッド
まとめ
ヘルパーメソッドは...
- 何のために作られる?:ビューの繰り返し処理を共通化するため
- どの範囲で使える?:基本的に全ビューで使用可能
- 注意点:用途を明確にするためにファイルを分けよう!
ヘルパーメソッドは「どこでも使える」が、「何のためのメソッドか」を明確にして適切なファイルに定義することが重要です。