Preloading a controller just once

I'm looking for a way to have a controller pre-loaded at application
startup and even in the development environment have it loaded just
once.

I'll make it a bit more concrete. I'm in the process of writing a little
plugin for interrogating the state of a Rails app. Among other things,
it ties into request handling and provides a hook for gathering
statistics. The code for calculating a statistic I'd like to define
within a controller. Currently it looks like this

  class StatusController < ApplicationController
    include HealthCheck
  
    define_check :database_available do
      ActiveRecord::Base.connection != nil
    end
  
    define_statistic :request_count, :accumulator => [0] do |
accumulator, *ignored|
      accumulator[0] += 1
    end
  end

With Rails working as it does, this code is only loaded when the status
controller is accessed for the first time through a request. Only from
then on are the defined statistics updated. In the development
environment the accumulated values are forgotten again on the next
request as classes are reloaded then.

To circumvent these issues, I'd like to load this particular controller
on startup and don't have it reloaded again. Any suggestions on how to
achieve this?

Michael

Hello Michael,

To circumvent these issues, I'd like to load this particular controller
on startup and don't have it reloaded again. Any suggestions on how to
achieve this?

Did you try to require or reference StatusController in environment.rb
? That would at least load the controller. Then, the reloading
part...

http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/dependencies.rb#L44

We have a way to unload constants, but not the reverse. Maybe this will help:
#will_unload?
http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/dependencies.rb#L288

Hope that helps !

Hello Michael,

Hi Francois, thanks for helping.

> To circumvent these issues, I'd like to load this particular
> controller on startup and don't have it reloaded again. Any
> suggestions on how to achieve this?

Did you try to require or reference StatusController in
environment.rb ? That would at least load the controller.

Yes, either results in an exception as the ApplicationController, the
superclass of StatusController, is not yet loaded and can't be
autoloaded either, apparently. I can require 'application', of course,
but that prevents reloading of ApplicationController even in the
development environment, I gather.

Then, the reloading part...

When I require StatusController in environment.rb, reloading is no
longer a problem. But as I said above, I don't like that I have to
require ApplicationController in addition. This appears to be causing
other mayhem, too. Just randomly clicking around in the app gave me an
exception: ArgumentError "A copy of AuthenticatedSystem has been
removed from the module tree but is still active!". I'm pretty sure
this is related to the explicit require for ApplicationController,
which includes AuthenticatedSystem.

Michael

Hello Michael,

This immediately results in an exception: "uninitialized constant
ApplicationController (NameError)". I've tried it on a freshly
generated project, too, and got the same exception.

Michael