【Rails】自作ヘルパの作成方法|controllerやscaffoldで自動生成されるapp/helpers/xxx_helper.rbの使い方

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。
[PR]

Railsには、link_to, button_to, image_tag, formt_tag, _url, _pathといった便利なヘルパーがデフォルトで用意されています。

ヘルパを呼び出せば、設定された処理を実行することができます。

デフォルトではないけどよく行う処理がある場合に、ヘルパを自分で作成することもできます。

ここでは、ヘルパを自分で作成する方法や注意点について解説しています。


ヘルパの作成場所

ヘルパは、app > helpers配下のファイルに記述します。

作成の選択肢は2つあります。

  1. application_helper.rbに記述する
  2. コントローラ名_helper.rbに記述する

application_helper.rbはデフォルトで存在します。この中にヘルパを定義することができます。

また、rails g controller コントローラ名rails g scaffold クラス名 を実行すると、コントローラ名_helper.rbというファイルが自動で生成されます。

このファイルの中に自作ヘルパを定義することもできます。


ヘルパを記述するファイルの注意点

application_helper.rbと、コントローラ名_helper.rb の用途は異なります。

application_helper.rbに記述したヘルパはどこからでも呼び出すことができます。

一方で、コントローラ名_helper.rb は、対象のコントローラの経由の処理でのみ使う場合に使用します。

なお、デフォルトの設定では、 application_helper.rbと、コントローラ名_helper.rb に記述したヘルパはどちらともに、どこからでも呼び出せる設定になっています。

対象のコントローラのみに限定する場合は、config > application.rbにconfig.action_controller.include_all_helpers = false を追記します。(デフォルトは記述がなく、trueの状態になります)

この設定をする(falseにする)と、他のコントローラのヘルパを呼び出したときはエラーになります(存在しないという判定になる)。


▼記入例

require_relative "boot"

require "rails/all"

Bundler.require(*Rails.groups)

module RailsVue
  class Application < Rails::Application
    (省略)

    #自作ヘルパをコントローラのスコープに限定する
    config.action_controller.include_all_helpers = false
  end
end

application.rbの変更内容を反映するためには、アプリケーションを再起動する必要があります。


ヘルパ名の注意点

自作ヘルパを作成するときは、同じ名前のヘルパを作成することができます。その場合、application.rbから、ファイル名の順に中身を読み込んでいき、ヘルパを上書きしていきます。

このため、同じヘルパがある場合は一番最後に読み込んだヘルパが適用されます。

これを回避するには、config > application.rbにconfig.action_controller.include_all_helpers = false を記述し、ヘルパの適用範囲を対象のコントローラのみに限定するとともに、

同じファイル内や、application_helper.rbとのヘルパの重複をなくす必要があります。


ヘルパの作成

ここでは、applicatoin_helper.rbの中にヘルパを作成します。

デフォルトの状態

ファイルはmodule(モジュール)となっています。デフォルトでは処理はなにも記述されていない状態です(ヘルパは無い状態)

module ApplicationHelper
end
moduleとは?

module(モジュール)とは、インスタンスなどを必要としない処理をまとめて記述する機能です。RailsではなくRubyの機能です。

module モジュール名
 def 処理1
  処理1の内容
 end

 def 処理1
  処理2の内容
 end
 .
 .
 .

 
end

クラスとの大きな違いは次の2点です。

  • インスタンスを生成できない
  • 継承できない


ヘルパの作成

テストのために、こんにちはを返すhelloヘルパと、足し算結果を返すplusヘルパを作成します。

module ApplicationHelper
    def hello(name)
        "#{name}さん、こんにちは"
    end

    def plus(x, y)
        return x + y
    end
end

これでヘルパの作成は完成です。とても簡単です。


ヘルパの呼び出し

ヘルパを呼び出す方法はビューファイルの中で呼び出す場合と、コントローラやモデルなどビューファイル以外のファイルで呼び出す場合で方法が異なります。

コントローラやモデルでも、application_helper.rbの中にあるヘルパを呼び出すか、各コントローラのヘルパを呼び出すかで呼び出し方が異なります。

  1. ビューファイルの中で呼び出す(そのまま)
  2. ビューファイル以外でapplication_helper.rbのヘルパを呼び出す(ApplicationController.helpers.を使う)
  3. ビューファイル以外で呼び出す(includeで読み込む)


ビューファイルの中で呼び出す

ビューファイルの中で呼び出す場合は、通常のヘルパと同じように、メソッド名のみで呼び出すことができます。

<%= hello("test") %>
<%= plus(1235, 9875) %>

▼実例

<p><%= hello("test") %></p>
<p><%= plus(1235, 9875) %></p>

↓ ブラウザの表示


ビューファイル以外で呼び出す(ApplicationController.helpersを使う)

ビューファイル以外のモデルやコントローラでメソッド名のみを指定するとエラーになります。

application_helper.rbにあるヘルパは冒頭にApplicationController.helpers をつけることで呼び出すことができます。

ApplicationController.helpers.ヘルパ

▼実例

コントローラのshowアクションで自作のhelloヘルパを呼び出します。

  def show
    @greet = ApplicationController.helpers.hello('show')
  end

ビューは次のようにします。

<p><%= @show %></p>

ブラウザの表示は次のようになります。



ビューファイル以外で呼び出す(includeで読み込む)

ビューファイル以外のモデルやコントローラでapplication_helper.rb以外のファイルにあるヘルパを読み込む場合は、クラスの中でそのファイルをincludeします。

include ヘルパクラス名

▼実例

コントローラのshowアクションで自作のhelloヘルパを呼び出します。

  include UsersHelper
  def show
    @show2 = helloUser('include')
  end

ビューは次のようにします。

<p><%= @show2 %></p>

ブラウザの表示は次のようになります。


エラー例

なお、コントローラやモデルで自作ヘルパを直接指定するとエラーになります。

  def show
    @greet = hello('show')
  end
エラー例

NoMethodError in UsersController#show
undefined method `hello’ for #<UsersController:0x00000000013da8>

タイトルとURLをコピーしました