Helperメソッドの動作確認

どうもHelperメソッドの動きが分からないので、動作を確認してみた。確認した環境は以下の通り。

  • Ruby1.8.7 P160
  • Rails2.1.2
  • Rails2.2.2
  • Rails2.3.2

まずはサンプルプロジェクトを作成

#rails _2.1.2_ watcher
#rails _2.2.2_ watcher2
#rails _2.3.2_ watcher3

それぞれでコントローラーを作る(それぞれのプロジェクトで作る)

#ruby ./script/generate controller boss index
#ruby ./script/generate controller staff index
#ruby ./script/generate controller member index

ヘルパーメソッドをそれぞれ作ってみる
app/helpers/boss_helper.rb

module BossHelper
  def whoareyou
    "I am Boss"
  end
end

app/helpers/memerb_helper.rb

module MemberHelper
  def whoareyou
    "I am Member"
  end
end

app/helpers/staff_helper.rb

module StaffHelper
  def whoareyou
    "I am staff"
  end
end

つぎにView側を作る。3つのファイルにそれぞれヘルパー呼び出しを書く。

  • app/views/boss/index.html.erb
  • app/view/member/index.html.erb
  • app/view/staff/index.html.erb
<%= whoareyou %>

期待としては以下の動きになるはず

つまりhttp://localhost:3000/boss/にアクセスしたら"I am Boss"と表示されて、http://localhost:3000/staffにアクセスしたら"I am staff"と、http://localhost:3000/memberにアクセスしたら"I am member"と表示されてほしい。

で、試してみたところ2.1.2も2.2.2も2.3.2も"I am staff"と表示される。つまり以下の動きをする。

各モジュール内に入っているメソッドが同じ名前の場合、個別にコールされるのではなく全て同じものがコールされてしまっている。

過程として全モジュールが読み込まれているんだが、アルファベットオーダーになってる気がする。なのでStaffより後のwomanを試しに作ってみよう(試したみたのはRails2.1.2)

#ruby ./script/generate controller woman index

これでヘルパーを追加してみよう。
app/helpers/woman_helper.rb

module WomanHelper
  def whoareyou
    "I am woman"
  end
end

予想通り、全ての表示が"I am woman"に変更された。ビューが表示されるときに全てのモジュールが取り込まれてかつ、アルファベット順に後ろからコールされるヘルパーが同一名のメソッドを上書きしてるように見える。ルールは分かったものこれが正常な動作なんだろうか???