ヘルパーの優先順位について。

  4 class ApplicationController < ActionController::Base
5   helper :all # include all helpers, all the time

Module: ActionController::Helpers::ClassMethods

When the argument is the symbol :all, the controller will include all helpers from app/helpers/**/*.rb under RAILS_ROOT.

この「helper :all」がデフォで書かれているために、どこに書いてもアプリケーション全体で使えるのだけれど、同じ名前のメソッドが複数あった場合の挙動がちょっとイヤな感じがしたのでメモ。

module ApplicationHelper
def hoge; 'hoge_app' end
end
module FooHelper
def hoge; 'hoge_foo' end
end
module BarHelper
def hoge; 'hoge_bar' end
end

こうなっているとき、Foo以下のビューからhogeを使うとして、FooHelperに定義がなかった場合にApplicationHelperよりもさきにBarHelperに定義したhogeが使われることになる。
アプリケーションよりもローカルを優先、という順番には納得できるのだけれど、関係ないコントローラー名のところにあるものが無意識に呼ばれちゃうのは気持ち悪いな、と。
そもそも「helper :all」がデフォで書かれてるってのがどうかと思うんだけど、なにか理由があるんだろうか。

あと、わりとどうでもいいことなんだろうけど、こういう説明を書くときに「application.rb」に定義されているものを指すのに「ApplicationController」と書くか「Applicationコントローラー」と書くか「アプリケーションコントローラー」と書くかで悩む。(なぜか「アプリケーションController」とは書きたくならない。)

コメント

  1. p0t より:

    rails_ext.rbのコード辺

    最近 config/initializers/rails_ext.rb に追加し…

  2. p0t より:

    今日のハマリ – Helperの優先順位

    Helperはrails2.xからApplicationControllerにh…

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