Tech Racho エンジニアの「?」を「!」に。
  • 開発

Railsのautoloadの使い方に気をつけよう

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的に使おうとするのが間違いなのかもしれませんが・・・
もっと良い方法を考えてみます。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。