Railsで共通モジュールなどはlibフォルダへ

Railsで共通モジュールなどをMix-inするケースは結構あると思いますが、これらをどこに保存すればいいのかいまいちわからず困っていました。もちろん、チェックロジックなどモデルに依存するものはモデルに書けばいいわけですが、モデルに依存するチェックロジックの中で使用する共通関数などはやはりどこか適当な場所にまとめたいと思うものです。

調べてみると、Rialsルート/libフォルダに保存すれば良いとのことでした。

ところが、ここからがかなりはまりました。libフォルダに保存したモジュールなどをテストしようと思ったのですが、どこにテストクラスを作成すればいいのかがわからないのです。test/unitフォルダ配下に保存するも、クラス名が定数だと怒られたりします(ーー;)

いろいろとGoogleで検索したところ下記のサイトが参考になりました。フォルダ構成を間違えていたことが原因でした。

libディレクトリとオートロード(autoload)

こちらに記載のある内容に加えて、libフォルダをautoloadの対象とするためにapplication.rbに一行追加しました。

[sourcecode language="ruby"] class Application < Rails::Application # Custom directories with classes and modules you want to be autoloadable. config.autoload_paths += %W(#{config.root}/lib) end [/sourcecode]

この内容を追加することで、autoloadの対象となります。これって、いわゆる遅延バインドと同じらしいですがよくわかっていません。 requireはアプリケーションの実行に対象となるファイルをロードするそうですが、autoloadは必要になったタイミングでロードするそうです。実際に試せていないので真偽のほどはわかりませんが…。

ちなみにmoduleのテストはincludeすることでテストが可能です。つまりは、privateなメソッドでもテスト可能ってことです!