そもそも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の方を使用したが、開発初期であれば、②の共通ファイルに書き出す方法の方が良いとは思う。
状況に応じて選択していきたい。