Rails4のConcernsでCircular dependencyがでてしまう場合の対策

Rails4のConcernsでCircular dependencyがでてしまう場合の対策メモ。



Rails4のConcernsでCircular dependencyがでてしまう場合の対策


ConcernsディレクトリはRailsが標準では読み込まないため、条件によってはCircular dependencyになってしまうようです。


activesupport-4.0.1/lib/active_support/dependencies.rb:461:in `load_missing_constant':
  Circular dependency detected while autoloading constant Abc::AbcAccessible (RuntimeError)

この例外は本番(production)モードで動かした時だけでたりするので注意が必要です…!


対策は簡単で、Concernsディレクトリまでモジュールのネームスペースに含んでしまえばOKです。



Circular dependencyの対策コード


元のコードが↓こういう感じだとして、


class Post < ActiveRecord::Base
  include Searchable
...

Concernsディレクトリ配下の名前空間を明確に書くと↓こういう感じになります。場合によってはこれだけでエラーがでなくなるようです。


class Post < ActiveRecord::Base
  include ::Searchable
...

もし上記の書き方でうまくいかなかった場合は、Concernsディレクトリをモジュールの名前空間に含めて、includeする時もその名前を指定すればOKです。


module Concerns::Searchable
  extend ActiveSupport::Concern
...

class Post < ActiveRecord::Base
  include Concerns::Searchable
...

私の場合は、Concerns:: まで明示的に書くことでエラーがでなくなりました。


上記のエラーは、Railsのissueにもなっているので、新しいバージョンのRailsではもしかしたら修正されるかもしれません。



参考リンク


Tips on Rails 4: RuntimeError on Circular dependency


ActiveSupport::Dependencies should not raise "Circular dependency..." when it try to load another invalid constant. #12394


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール