warning: toplevel constant/RuntimeError: Circular dependency detectedエラー

スポンサーリンク

Rails で STI(Single Table Inheritance)の機能を用いつつ、継承を行っているモデルのクラスで、表題のエラーに遭遇しました。モデルのクラス名の constant のロードでどうやら問題が発生した模様で、以下のようなエラーが出た。

warning が出るとともに、RuntimeError 発生で 500 エラーとなってしまった。ちなみにこのエラーは、development 環境で発生せずに staging 環境でのみ発生したりする少々やっかいなものでした。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
Rails 4.1.6

モデルの配置・継承関係

以下のように STI を使いつつモデルのクラスを継承した階層で配置していた。

app/models/bar.rb

app/models/foo/bar.rb

app/models/foo/bar/baz.rb

このモデルの階層で、モデルのクラス名の読み込みが上手く行われていなかったのが原因のようです。

config/initializers 内でファイルを require して解決

結論から言いますと、以下の qiita エントリーのおかげで解決でき助かりました。ありがとうございます。

Rails – クラスロード問題ではまる – Qiita

上記エントリーに書いてある方法と同様で、モデルのクラス名の constant を上手くロードさせるために、config/initializers で必要なファイルを require したところ解決できました。

以下のように、app/models/foo 以下のファイルを initializers で require して読み込ませるようにする。

config/initializers/requirements.rb

これで解決できまして、表題の warning も RuntimeError も発生しなくなりました。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!