Railsには便利なautoloadがあるので、たとえば lib/util/test.rb に
module Util module Test def hoge puts 'hello' end end end
と書いて、コントローラなどで
def HogeController < ApplicationController def index Util::Test::hoge end end
とやれば、勝手にロードしてくれます。
しかし、毎回打つのが面倒だからと
def HogeController < ApplicationController include Util def index Test::hoge end end
みたいなことをやろうとしても、うまくいきません。
railsのソースコード内で、以下のような場所にあるdependencies.rbがautoloadを実現しているのですが、
C:\ruby\lib\ruby\gems\1.8\gems\activesupport-2.3.5\lib\active_support\dependencies.rb
これは、const_missingが発生したときに、定数名から該当する.rbファイルを自動的に読むものです。
つまり、include Util とやると、lib/util.rb を探しに行ってしまいます。
utilはフォルダであってファイルではないので、見つからずエラーになります。
毎回 Util::Test::hoge とやるか、
def HogeController < ApplicationController include Util::Test def index hoge end end
のようにやれば済む話なのですが、Test::hogeという呼び方をしたくなりますよね・・・
Testをclassにして、hogeをクラスメソッドにして、手動でloadすれば解決しますが、いまいち美しくないです。
そもそもnamespace的に使おうとするのが間違いなのかもしれませんが・・・
もっと良い方法を考えてみます。