便利そうだが、いとも簡単に複雑化してしまうので備忘としてメモ。
環境
$ 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メソッドと同じ扱いになるので、メソッドの露出範囲がわかりにくくなる。
そのため利用するときは影響範囲を気を払う必要がある。