What does Reloadable mean in rails source code?

In Rails pre-1.2 (in 1.2 this has been revised, I need to reread the code), the Reloadable module marked classes that we wanted to be reloaded if reloading was active. But sometimes you don't want your very class to be reloadable, but its subclasses.

Models and controllers are reloaded in development mode because ActiveRecord::Base and ActionController::Base mixin Reloadable::Subclasses:

   module ActiveRecord      ...      class Base        ...        include Reloadable::Subclasses        ...      end      ...    end

The rationale here is that Rails evolves fast but not _that_ fast :-), so there's no point reloading ActiveRecord::Base itself in each request. With that little trick you skip reloading the framework AND free the programmer from having to mark each model and controller.

When you include Reloadable in a class, it gets a class method called reloadable? that returns true.

   unless base.respond_to?(:reloadable?)      class << base        define_method(:reloadable?) { true }      end    end

When you include Reloadable::Subclasses in a class it gets a class methods called reloadable? that returns true unless the class is the one where the method was defined. That's the clousure:

   module Subclasses      def self.included(base) #nodoc:        base.send :include, Reloadable        (class << base; self; end).send(:define_method, :reloadable?) do           base != self        end      end    end

And so, when Rails wants to reload the part of the application that is reloadable, it iterates over all classes in the ObjectSpace, and asks to those classes whether they respond to reloadable? In that case Rails send :reloadable? and the constant is removed if the method returns true.

That happens at the end of each request (if reloading is turned on). As you see the way to get reloading is to remove the constant, if we just reinterpreted the file we would be *reopening* the class, which is not the same thing. Thus, the very reloading is delegated again to const_missing.

-- fxn

Xavier :

> In the actionpack-1.12.5\lib\action_controller\base.rb, > you can see the definition: > class Base > > include Reloadable::Subclasses

In Rails pre-1.2 (in 1.2 this has been revised, I need to reread the code),

Reloadable mechanism is deprecated in 1.2. If my understanding is correct, this is now handled by the Dependencies new code.

   -- Jean-François.