- 更新日: 2015年9月1日
- Rails
warning: toplevel constant/RuntimeError: Circular dependency detectedエラー
Rails で STI(Single Table Inheritance)の機能を用いつつ、継承を行っているモデルのクラスで、表題のエラーに遭遇しました。モデルのクラス名の constant のロードでどうやら問題が発生した模様で、以下のようなエラーが出た。
1 2 3 4 |
warning: toplevel constant Bar referenced by Foo::Bar RuntimeError: Circular dependency detected while autoloading constant Foo::Bar::Baz |
warning が出るとともに、RuntimeError 発生で 500 エラーとなってしまった。ちなみにこのエラーは、development 環境で発生せずに staging 環境でのみ発生したりする少々やっかいなものでした。
— 環境 —
Rails 4.1.6
モデルの配置・継承関係
以下のように STI を使いつつモデルのクラスを継承した階層で配置していた。
app/models/bar.rb
1 2 |
class Bar < ActiveRecord::Base end |
app/models/foo/bar.rb
1 2 |
class Foo::Bar < Bar end |
app/models/foo/bar/baz.rb
1 2 |
class Foo::Bar::Baz < Foo::Bar end |
このモデルの階層で、モデルのクラス名の読み込みが上手く行われていなかったのが原因のようです。
config/initializers 内でファイルを require して解決
結論から言いますと、以下の qiita エントリーのおかげで解決でき助かりました。ありがとうございます。
上記エントリーに書いてある方法と同様で、モデルのクラス名の constant を上手くロードさせるために、config/initializers で必要なファイルを require したところ解決できました。
以下のように、app/models/foo 以下のファイルを initializers で require して読み込ませるようにする。
config/initializers/requirements.rb
1 |
Dir[Rails.root.join("app/models/foo/**/*.rb")].sort.each { |f| require f } |
これで解決できまして、表題の warning も RuntimeError も発生しなくなりました。
- – 参考リンク –
- ruby – Preventing “warning: toplevel constant B referenced by A::B” with namespaced classes in Rails – Stack Overflow
- Rails で Class がうまく読み込まれない問題と戦った話 – Qiita
- 定数の自動読み込みと再読み込み | Rails ガイド
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!