# Dependency loading confusion

**URL:** <https://www.ruby-forum.com/t/dependency-loading-confusion/184360>\
**Category:** Rails\
**Created:** [March 1, 2010, 1:29pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360 "2010-03-01T13:29:23Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Adam\_CigSSSSnek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e480ec/32.png) [@Adam\_CigSSSSnek](https://www.ruby-forum.com/u/Adam_CigSSSSnek)\
**Post date:** [March 1, 2010, 1:29pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360/1 "2010-03-01T13:29:23Z")

</div>

Hey guys,

I have a module Foo::Bar, which extends ActiveRecord::Base with some  
custom functionality. This module is in lib/foo/bar.rb. Inside this  
file is also the code, that includes the module into  
ActiveRecord::Base:

```
module Foo
  module Bar
    # stuff ...
  end
end

ActiveRecord::Base.send(:include, Foo::Bar)

```

Then, this file is required in config/initializers/foo.rb:

```
require 'foo/bar'

```

The problem is, that sometimes i get this nasty error:

```
A copy of Foo::Bar has been removed from the module tree but is

```

still active!

and I really can’t figure out what’s the problem. The weird thing is  
that the error disappears when I restart the application, but  
sometimes appears again on a different page. It looks completely  
magical to me 🙂

Everything works fine in test and production environments, so this has  
probably something to do with the Rails dependency loading/unloading  
magic.

So, I guess I can make it into a plugin, but it’s really very simple  
and quite specific to my application, so it’s not worth the effort.  
That’s why I want to keep it only in lib.

Things I tried:

- Putting the lib/foo path into config.load\_once\_paths in config/  
environment.rb
- adding unloadable to the Foo::Base module
- moving the include line (ActiveRecord::Base.send(:include, …) into  
config/initializers/foo.rb

But nothing helps ☹

Any help will be appreciated. Thanks.

adam.

---

<div class="post-metadata">

**Author:** ![Adam\_CigSSSSnek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e480ec/32.png) [@Adam\_CigSSSSnek](https://www.ruby-forum.com/u/Adam_CigSSSSnek)\
**Post date:** [March 1, 2010, 1:35pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360/2 "2010-03-01T13:35:14Z")

</div>

On Mar 1, 12:12 pm, Adam Cigánek [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> end
> A copy of Foo::Bar has been removed from the module tree but is
> 
> ```
> 
> still active!
> 
> and I really can’t figure out what’s the problem. The weird thing is  
> that the error disappears when I restart the application, but  
> sometimes appears again on a different page. It looks completely  
> magical to me 🙂

What happens is that your app loads and serves the first request fine.  
Then rails unloads unloadable code. When the next request arrives,  
ActiveRecord::Base, which isn’t reloadable now has the dead module  
included. Only development uses this way of loading classes

> - Putting the lib/foo path into config.load\_once\_paths in config/  
> environment.rb

This should work. You do (if my memory is correct) need to use  
absolute paths though - check what’s already in  
ActiveSupport::Dependencies.load\_once\_paths

Fred

---

<div class="post-metadata">

**Author:** ![Adam\_CigSSSSnek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e480ec/32.png) [@Adam\_CigSSSSnek](https://www.ruby-forum.com/u/Adam_CigSSSSnek)\
**Post date:** [March 1, 2010, 3:56pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360/3 "2010-03-01T15:56:19Z")

</div>

Thanks for the reply Fred.

> This should work. You do (if my memory is correct) need to use  
> absolute paths though - check what’s already in  
> ActiveSupport::Dependencies.load\_once\_paths

It doesn’t ☹ I checked the content of  
ActiveSupport::Dependencies.load\_once\_paths and the lib/foo is there  
and it’s an absolute path. It is first element of the list, all the  
others are plugins and gems paths. Not sure if I’m doing it correctly,  
but I put this into the Rails::Initializer.run { … } block in the  
config/environment.rb:

```
config.load_only_paths << "#{Rails.root}/lib/foo"

```

just after I define all gem dependencies.

Am I doing it right?

adam.

---

<div class="post-metadata">

**Author:** ![Adam\_CigSSSSnek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e480ec/32.png) [@Adam\_CigSSSSnek](https://www.ruby-forum.com/u/Adam_CigSSSSnek)\
**Post date:** [March 1, 2010, 6:03pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360/4 "2010-03-01T18:03:55Z")

</div>

> Ah, don’t forget to do require\_dependency rather than require (or  
> else you’re half bypassing the rails dependency system and odd things  
> can happen). Worth also sticking some breakpoints in AS::Dependencies  
> to check that your file is being handled properly.

Hey, that was it! Ok, now I understand the dependency loading voodoo  
little bit better 🙂 Thanks Fred.

adam.

---

<div class="post-metadata">

**Author:** ![Adam\_CigSSSSnek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e480ec/32.png) [@Adam\_CigSSSSnek](https://www.ruby-forum.com/u/Adam_CigSSSSnek)\
**Post date:** [March 1, 2010, 4:25pm UTC](https://www.ruby-forum.com/t/dependency-loading-confusion/184360/5 "2010-03-01T16:25:35Z")

</div>

On Mar 1, 2:55 pm, Adam Cigánek [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> config.load_only_paths << "#{Rails.root}/lib/foo"
> 
> ```
> 
> just after I define all gem dependencies.

Ah, don’t forget to do require\_dependency rather than require (or  
else you’re half bypassing the rails dependency system and odd things  
can happen). Worth also sticking some breakpoints in AS::Dependencies  
to check that your file is being handled properly.

Fred
