Help: A copy of ModelSecurity has been removed from the module tree but is still active!

Hi all, I'm posting this in the hope that someone who understands
rails dependencies can shed some light.

I've implemented a "ModelSecurity" module in the vein of Bruce Peren's
old ModelSecurity plugin (http://rubyforge.org/projects/model-
security/ ).

My ModelSecurity module lives in $RAILS_ROOT/lib. It is automatically
included into ActiveRecord::Base by a file in config/initializers. BTW
this is on rails 2.1 stable.

Everything works fine and dandy (including mongrel in development
mode) EXCEPT when I do "reload!" inside script/console -- then I get
the following error the next time any of my ModelSecurity methods are
called:

  ArgumentError: A copy of ModelSecurity has been removed from the
module tree but is still active!

I have tried adding an "unloadable" declaration to my ModelSecurity
model, but it makes no difference.

I also tried adding the "unloadable" declaration to ActiveRecord::Base
itself (I was grasping at straws there), but that doesn't work either
-- it causes "reload!" to fail with:
  NameError: uninitialized constant ActiveRecord::Base

Admittedly this isn't a huge problem (it only affects script/console)
but it is annoying because quitting and re-running script/console
takes ~12s on my system.

Cheers
Dave.

Hi all, I'm posting this in the hope that someone who understands
rails dependencies can shed some light.

I've implemented a "ModelSecurity" module in the vein of Bruce Peren's
old ModelSecurity plugin (http://rubyforge.org/projects/model-
security/ ).

My ModelSecurity module lives in $RAILS_ROOT/lib. It is automatically
included into ActiveRecord::Base by a file in config/initializers. BTW
this is on rails 2.1 stable.

Add that file to Dependencies.load_once_paths ?

Fred

Hi all, I'm posting this in the hope that someone who understands
rails dependencies can shed some light.

Basically the problem is that it's trying to remove that module, but
ActiveRecord::Base still references it. So your module has to live
outside of the reloading paths. Either in a plugin or some other path
you manually add to load_once_paths (as frederick mentioned).

If you want to reload this module you can simulate it with just:

load 'model_security.rb'

It's not strictly the same, but it will have the desired result for you.

Thanks guys, that worked a treat. It's nice to understand what's going
on under the hood. :slight_smile:

Dave.