2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

helperを作る際の注意点

Last updated at Posted at 2023-01-23

環境

Rails 5.2

はじめに

helperを作る際の注意点について書いてみました。

helperは、大元的な役割をする、application_helper.rb以外に、各コントローラごとのhelperが存在します。例えば、sessionuserの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/application.rb
config.action_controller.include_all_helpers = false

上記の1行を追加しても、sessions_helper.rbに記述するヘルパーメソッドを、application_helper.rbに転記すれば、views/sessionsフォルダ配下のViewファイル以外からでも呼び出せるようになります。転記することなく、下記のようにincludeすれば、共通で呼び出すことができるようになります。

application_helper.rb
module ApplicationHelper
    include Master::UsersHelper
    include Master::SessionsHelper
end

コントローラのメソッドをヘルパーメソッドにする

Viewから呼び出すヘルパーメソッドは、controllers/helpers配下の、Viewのフォルダ名に対応したヘルパーファイルに作成するのがセオリーでした。しかし、コントローラーに記述したメソッドを、ヘルパーメソッドにして、Viewで呼び出すこともできます。例えば、下記のようなやり方です。つまり、helper_method :メソッド名を宣言すればいいだけで、ヘルパーメソッドにすることができます。

application_controller.rb
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を定義するといった使い訳になりそうです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?