Ruby
Rails

Rails development環境の時のみ、クラス探索に失敗してNameErrorが出るケース

More than 1 year has passed since last update.

要約

Railsのdevelopment環境では、クラスロードで読み込めない事象が発生する場合がある。
回避方法は3つ。

起こったこと

  1. Hoge::Fuga::TestsController というコントローラーを作成
  2. 1のコントローラー内で Fuga::Test モデルを呼んだら、development環境の時だけ NameError が出る。
  3. エラー画面には uninitialized constant Hoge::Fuga::TestsController::Fuga が出る。

原因

  • クラス探索に失敗してるっぽい。
    • Hoge::Fuga::TestsController::Fuga 内で Fuga::Test を探している。

対処法

  1. Hoge::Fuga::TestsControllerrequire_dependency('app/models/fuga/test') を書く
    このコントローラーだけリクエストのたびにクラス定義が再ロードされるからパフォーマンスに影響が出る。

  2. 名前空間に同じ単語が来ないように調整する
    本来的には同じ単語が来る設計にしない方がいいんだろうけど、フレームワークが設計の自由度下げてどうするんだとは思う。(でもRailsだしな...)

  3. ::Fuga::Test と書く
    スコープ演算子 :: を先頭に書くと、クラス階層のトップレベルという意味になる

感想

Rails書き始めて20日くらいなんだけど、これは常識なんだろうか?

参考