コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsでViewからControllerのメソッドを呼び出したいときはhelper_methodで定義するとできるが利用には気を払う

便利そうだが、いとも簡単に複雑化してしまうので備忘としてメモ。

環境

$ bin/rails -v
Rails 7.1.2
$ ruby -v
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [aarch64-linux]

helper_methodの使い方

Controllerに存在するメソッドをViewで呼び出したいときに、helperのように扱えるようにするメソッド。またメソッドの呼び出し制限がprivateでも適用可能。

例えば下記のように設定する

▼app/controllers/users_controller.rb

class UsersController < ApplicationController
  helper_method :test_text

  def index
  end

  private
  
  def test_text
    "テストテキストです"
  end

end

▼app/views/users/index.html.erb

<h1>Users#index</h1>
<%= test_text %>

というように定義すると以下のようなhtmlが出力される。

<!DOCTYPE html>
<html>
  <head>
    <!-- 中略 -->
  </head>

  <body>
    <h1>Users#index</h1>
テストテキストです

  </body>
</html>

利用しないほうがいいポイント

予測がし難い

helper自体が定義の仕方によっては定義場所の特定がわかりにくいので、view側から特定するのが難しくなります。 また、superクラスやconcernで読み込んだメソッドも同じように扱えてしまうので、より特定がしづらくなります。

Controllerでの記述がViewにも影響を受けやすくなる

多くの場合は以下のようにインスタンス変数を取得したい場合などで使う

class UsersController < ApplicationController
  helper_method :access_user
  
  def index
  end
  
  private

  def access_user
    @user ||= User.find(params[:id])
  end
end

上記のようにcontroller上でインスタンス化された値などを再利用するケースでは一見便利なように見える。

しかしながら、上記のような記述だと一見してこのcontrollerでしか使わないように見える access_user メソッドが helper_method の影響でpublicメソッドと同じ扱いになるので、メソッドの露出範囲がわかりにくくなる。

そのため利用するときは影響範囲を気を払う必要がある。

関連リンク