環境
Rails 5.2
はじめに
helperを作る際の注意点について書いてみました。
helperは、大元的な役割をする、application_helper.rb以外に、各コントローラごとのhelperが存在します。例えば、sessionとuserの2つのコントローラを作れば、sessions_helper.rbと、users_helper.rbのヘルパーがそれぞれ自動で生成されます。
views/sessionsフォルダ配下にある、各Viewファイルから呼び出して使うhelperを作る場合は、sessions_helper.rbに記述します。そして、views/usersフォルダ配下にある、各Viewファイルから呼び出して使うhelperを作る場合は、users_helper.rbに記述します。
しかし、sessions_helper.rbに記述したヘルパーメソッドを、views/usersフォルダ配下にある、Viewファイルから呼び出すことができるようになっています。逆に、users_helper.rbに記述したヘルパーメソッドを、views/sessionsフォルダ配下にある、Viewファイルから呼び出すこともできるようになっています。
これはこれで問題はないのですが、このような状態になっていれば、後々、混乱の元になりそうです。
sessions_helper.rbに記述したヘルパーメソッドは、views/sessionsフォルダ配下にある、Viewファイルからのみ呼び出せるようにし、それ以外のViewファイルからは、呼び出せないようにしておいた方が、整理されたコーディングができそうです。
それを実現できるようにするには、下記の設定が必要です。この設定はデフォルトでは設定されていないため、1行追加する必要があります。
下記の1行を追加すると、sessions_helper.rbに記述したヘルパーメソッドは、views/sessionsフォルダ配下にある、Viewファイル以外からは呼び出せないようになります。呼び出そうとすればエラーになります。
config.action_controller.include_all_helpers = false
上記の1行を追加しても、sessions_helper.rbに記述するヘルパーメソッドを、application_helper.rbに転記すれば、views/sessionsフォルダ配下のViewファイル以外からでも呼び出せるようになります。転記することなく、下記のようにincludeすれば、共通で呼び出すことができるようになります。
module ApplicationHelper
include Master::UsersHelper
include Master::SessionsHelper
end
コントローラのメソッドをヘルパーメソッドにする
Viewから呼び出すヘルパーメソッドは、controllers/helpers配下の、Viewのフォルダ名に対応したヘルパーファイルに作成するのがセオリーでした。しかし、コントローラーに記述したメソッドを、ヘルパーメソッドにして、Viewで呼び出すこともできます。例えば、下記のようなやり方です。つまり、helper_method :メソッド名を宣言すればいいだけで、ヘルパーメソッドにすることができます。
class ApplicationController < ActionController::Base
helper_method :current_user
private
def current_user
@current_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
end
end
結論
ヘルパーメソッドは、helpersフォルダ内の、xxx_helper.rbファイルに記述する場合と、コントローラにhelper_methodを定義する方法の2通りの呼び出し方があることになります。
どっちを使うべきか悩むところですが、Viewからしか呼び出さない場合は、xxx_helper.rbファイルに記述し、Viewとコントローラと双方から呼び出す場合は、helper_methodを定義するといった使い訳になりそうです。