This is an interesing bug I've encountered this week. While our Rails application was working in development it was completely broken in UAT environment (which is 99% production like)
We were getting
Circular dependency detected while autoloading constant error on all of our reports.
Not so long ago we've extracted group of controllers in its own rails engine with isolated namespace
Merchant. After some investigation we've spotted the bug, let's see if you can find it.
module Merchant class Reports::PostsController < ApplicationController # some code here end end
Do you see it? It's not obvious is it? How about these alternatives:
module Merchant module Reports class PostsController < ApplicationController # some code here end end end
module Merchant::Reports class PostsController < Merchant::ApplicationController # some code here end end
class Merchant::Reports::PostsController < Merchant::ApplicationController # some code here end
All of these work except the first one. What's going on here? My guess will be
- Rails loads
- It looks for
Merchant::ApplicationControllerand loads it
Merchant::ApplicationControllersomehow triggers the load of
Merchantmodule, which loads all classes in it.
Circular dependency detected while autoloading constanterror
So the fix was to rewrite it with different ruby style.