【Ruby on Rails】コントローラーで独自のヘルパーメソッドを使用する方法

そもそもRailsのヘルパーは、ビューの開発をより便利にするためのメソッドという認識だが、コントローラーからも呼び出せないかな?と疑問に思ったので調べてみた。

エンジニア|ポートフォリオ
新人

間違っている箇所あったらコメントで教えてね。

まず、前提としてRuby on Railsにはデフォルトにいくつか便利なヘルパーが備わっている。

デフォルトのヘルパー

・link_to

・number_with_delimiter

・form_tag

今回は、そもそものヘルパーメソッドの説明については割愛するので、ヘルパーについての詳細はこちら、Railsヘルパーメソッドのまとめ(よく使うもの)をご覧ください。

【Rails】ヘルパーの呼び出し方2つ

結論として、コントローラーからヘルパーを呼び出す方法は2つある。

  • ヘルパーを呼び出す方法①:メソッド先頭にview_contextをつける
  • ヘルパーを呼び出す方法②:application_controllerに記述

ヘルパーを呼び出す方法①:メソッド先頭にview_contextをつける

まず、最小限の変更で済む方法から。既にある処理への影響を最小限にする方法。

ビュー用に作った現行のヘルパーの処理をなるべく変えたくない、という場合はこちらの方法が良さそうだ。

エンジニア|ポートフォリオ
ベテラン

既にRailsの開発がある程度進んでおり、
既存処理を変えたくない場合はこちらが良いかな。

  • 現行のヘルパーファイル:app/helpers/sample_helper.rb 
module SampleHelper
  def helper_method
    # 処理の内容
  end
end

呼び出すのは簡単で、コントローラーで「view_context」をつけるだけ。

  • コントローラーファイル:app/controllers/sample_controller.rb 
class SampleController < ActionController::Base
  def index
    # 呼びたい箇所で、先頭にview_contextをつけるだけ
    view_context.helper_method
  end
end
エンジニア|ポートフォリオ
新人

クラス名とかはつけなくて良いのかな?

と思う人もいるかもしれないが、「view_context.helper_method」だけで良い。

ヘルパーを呼び出す方法②:application_controllerに記述

本来はこちらが良いとは思う。

Railsのドキュメントにもあるが、ビュー+コントローラー両方で、もしくはアプリケーション全体でヘルパーを使いたい場合は、「app/helpers/application_controller.rb」に処理を記述する。

  • 共通コントローラーファイル:app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base
  # アプリケーション共通の設定として、読み込む
  include SampleHelper
end
  • コントローラーファイル:app/controllers/sample_controller.rb 

コントローラーで使用する場合は、既にアプリケーションの設定としてメソッドを読み込まれているので、メソッド名を記述するだけで呼び出せる。

class SampleController < ActionController::Base
  def index
    # 呼び出す
    helper_method
  end
end
  • ビューファイル:app/views/samples/index.html.erb 

ビューに関しても一緒で、既にアプリケーションの設定としてメソッドを読み込まれているので、メソッド名を記述するだけで呼び出せる。

<h1>Helper Test</h1>

<p><%= helper_method %></p>

まとめ

開発が既にある程度進んでいると、既にある処理をなるべく変えたくないな…なんてことはありがち。今回私は個人的に、view_contextの方を使用したが、開発初期であれば、②の共通ファイルに書き出す方法の方が良いとは思う。

状況に応じて選択していきたい。

参考

この記事を書いた人

竹田奈央

石川県出身 / 都内在住 / 国立大中退→情報工学科卒 / フリーランスの女性WEBエンジニア / フルリモート / アラサー / 独身 / #ADDress ワーケーション / 松本人志・千鳥好き/ 下記Twitter OR LinkedInボタンで繋がってくれると嬉しいです