久しぶりに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
コメント