要約
Railsのdevelopment環境では、クラスロードで読み込めない事象が発生する場合がある。
回避方法は3つ。
起こったこと
-
Hoge::Fuga::TestsController
というコントローラーを作成 - 1のコントローラー内で
Fuga::Test
モデルを呼んだら、development
環境の時だけNameError
が出る。 - エラー画面には
uninitialized constant Hoge::Fuga::TestsController::Fuga
が出る。
原因
- クラス探索に失敗してるっぽい。
-
Hoge::Fuga::TestsController::Fuga
内でFuga::Test
を探している。
-
対処法
Hoge::Fuga::TestsController
にrequire_dependency('app/models/fuga/test')
を書く
このコントローラーだけリクエストのたびにクラス定義が再ロードされるからパフォーマンスに影響が出る。名前空間に同じ単語が来ないように調整する
本来的には同じ単語が来る設計にしない方がいいんだろうけど、フレームワークが設計の自由度下げてどうするんだとは思う。(でもRailsだしな...)::Fuga::Test
と書く
スコープ演算子::
を先頭に書くと、クラス階層のトップレベルという意味になる
感想
Rails書き始めて20日くらいなんだけど、これは常識なんだろうか?