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