uninitialized constant oddities

hi there!

unfortunately, we are repeatedly having problems with uninitialized
constants in our rails app (v1.1.6), which is running on a mongrel
cluster behind apache's mod_proxy_balancer.

---- snip ----
NameError (uninitialized constant Base):
    [...]
    /app/models/image.rb:90:in `subclasses'
    /app/models/image.rb:98:in `subclass?'
    /app/models/image.rb:261:in `count'
    /app/controllers/image_controller.rb:95:in `list'
---- snip ----

"Base" is actually "Image::Base", defined in lib/image/base.rb:
class Image::Base.

immediately after a mongrel_cluster restart it's working for a few
requests, though. (approx. 4 requests, resulting from 4 mongrel
servers being run?) the strange thing just is that everything works
fine when run from script/console ... except when commenting out the
"require 'image/base'" from config/environment.rb! -- how come?

code details are as follows:

app/controllers/image_controller.rb: class ImageController <
ApplicationController:

---- snip ----
  def list
    # Image.count is where all evil originates
    @images = ::Paginator.new(Image.count, 10) { |offset, per_page|
      Image.find(:all, :limit => per_page, :offset => offset)
    }.page(params[:page])
  end
---- snip ----

app/models/image.rb: class Image < Entity (Entity < ActiveRecord::Base):

---- snip ----
  def count
    return super if subclass?

    subclasses.inject(0) { |sum, klass|
      sum += klass.count
    }
  end

  def subclass?
    subclasses.include? self
  end

  # here's where the uninitialized constant comes in
  def subclasses(table_must_exist = true)
    Image::Base.subclasses table_must_exist
  end
---- snip ----

any ideas on what might cause this (mis-)behaviour would be greatly
appreciated.

TIA & cheers
jens

we have just discovered that the problem only occurs in development
mode -- production mode works fine. so it seems certain constants
(modules/classes) "get lost" by rails' (re-)loading behaviour in
development mode. but how to overcome this issue? anyone care to
help us out on this one?

cheers
jens

jens wille [04/01/07 17:49]:

Hi Jen - have you tried Image::ActiveRecord::Base?

-Paul

hi paul!

Paul Corcoran [05.01.2007 18:35]:

Hi Jen - have you tried Image::ActiveRecord::Base?

well, no... since the class in question is actually Image::Base, not
Image::ActiveRecord::Base. it's only Image that /inherits/ from
ActiveRecord::Base, via Entity. so i assume the path is totally
correct - as running in production mode shows -, it's just that this
class (Image::Base) seems to be "there" only immediately after
starting the mongrel servers (i.e., after loading the whole code
base) -- which appears quite strange to me.

i mean, why do i even have to require image/base in environment.rb
in order to get that constant? i don't usually have to for other
classes and modules in lib/ (of course, there are other reasons why
i might have to do that, which apply to image/base, too). it seems
that this issue has in some way to do with the fact that Image
already is a model class. but in what way? and what can we do about
it? i'm kinda stuck...

cheers
jens

I will jump in here, with more of a question than an answer. I am
totally new to rails. Have developed an app locally on my laptop. It
works fine. I just tried to set up my web host environment for the
first time and it seems that ALL of my application classes are not
being found when I run in production environment. Furthermore, in the
"script/console production" , when I try to run Rails:Info I get
NameError: uninitialized constant Rails::Info. Any quick tips for a
newbie?

nevermind :slight_smile: Pilot error copying files onto web host was my problem.