rails_helperの名前空間を切る

久しぶりにrailsのhelperメソッドを作ってるときにメソッド名の名前付けに悩んだ話

railsのhelperはデフォルトではすべて読み込まれている

このデフォのせいでいろいろあるヘルパーメソッドが重複しないように気をつけないといけない、すると途端に妙に長ったらしいセンスのないメソッド名になりがちになりませんか?

なんかこう

「処理名_for_リソース名」みたいな、、

そして当たり前ですがhelper群ってモジュールでしかないので同じ処理名がかぶっていてもエラーにはなりません。

そうすると

Aというhelperでaというメソッド名を定義

Bというhelperでaというメソッド名を定義することができます

同じ名前のメソッドがある場合どうなるか?

結論、特定のviewで呼び出すとアルファベット順に読み込まれた最後のヘルパーメソッドが適応されます。

つまり

先ほどの例で例えるとAヘルパーでこう書いて

module AHelper
  def a
    'A'
  end
end

Bヘルパーでこのように書く

module BHelper
  def a
    'B'
  end
end

これを任意のviewで呼び出す

<%= a %>

とアルファベット順に読み込まれた最後のモジュールであるBヘルパーのaが参照されるのでBが表示される

簡単なプロダクトならいいんだけどこれもしでかいプロダクトなったらカオスになるし名前付けもしんどくなるよな・・・(実際なった)

どうすんのがよさげ?

カオスになる前にこうした方が良いのでは?

Rails アプリケーションの設定項目 - Railsガイド
Railsアプリケーションの基本的な設定方法(Config:コンフィグ)について解説します。

application.rbに以下を設定する

config.action_controller.include_all_helpers = false

こうすると例えば先ほどのコードでAヘルパーのaを呼び出せるのはAコントローラーに属するviewファイルのみになるのでヘルパー同士の名前の重複によっておこる影響がなくなります。

ちなみに上記設定をしてもapplication_helper.rbのヘルパーメソッドはどのviewからでも呼べます

この方がrails_wayっぽくて直感的でいいんだけどな・・デフォでこうしとけよTT

コメント

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