Class Loader Weirdness | Rails 3.0.3

Hi guys,

I am stuck on, what i think is a class loader issue.

In my app/models directory i have the following files:

reductions/base.rb
reductions/conversions_by_bucket.rb
reductions/conversions_by_hour.rb
reductions/impressions_by_hour.rb

(background – i am using mongoid, and i use these files to manage
mapReduce)

These classes only have class methods. In each of these classes I
added the following method:

def self.hello
“hello”
end

And checkout this weirdness from the rails console:

Reductions::ImpressionsByHour.hello
=> “hello”
Reductions::ConversionsByHour.hello
=> “hello”
Reductions::ImpressionsByBucket.hello

NoMethodError: undefined method `hello’ for
Reductions::ImpressionsByBucket:Class

BUT …

require ‘reductions/conversions_by_bucket.rb’
=> nil
Reductions::ConversionsByBucket.hello
=> “hello”

Soooooo weird!!! So why is reductions/conversions_by_bucket.rb not
being loaded by the class loader?!

I am using rails 3.0.3

Thanks!!

I have the feeling the class-names are bit mismatched. what is the
relation between Reductions::ConversionsByBucket and
Reductions::ImpressionsByBucket ?

  • Kristian

Yeah I thought that too – but i have looked it over hundreds of times
and can’t find the mismatch. I have simplifed the classes to just
have the hello method. And still have the same behavior. Here are
the three classes

#app/models/reductions/impressions_by_hour.rb
class Reductions::ImpressionsByHour
def self.hello
“hello”
end
end

#app/models/reductions/conversions_by_hour.rb
class Reductions::ConversionsByHour
def self.hello
“hello”
end
end

#app/models/reductions/conversions_by_bucket.rb
class Reductions::ConversionsByBucket
def self.hello
“hello”
end
end

ls app/models/reductions/
base.rb conversions_by_bucket.rb
conversions_by_hour.rb impressions_by_hour.rb unions.rb

The relationship between the classes is that they all perform map/
reduce methods. base.rb holds common code between them

I’m sure its something simple, but I am stumped!

– Jonathan

I should add, that the class kind-of gets loaded, Checkout the
following rails console sequence:

[2] > Reductions::ConversionsByBucket
=> Reductions::ConversionsByBucket
[3] > Reductions::ConversionsByBucket.class
=> Class
[4] > Reductions::ConversionsByBucket.hello
NoMethodError: undefined method `hello’ for
Reductions::ConversionsByBucket:Class

[5] > require ‘reductions/conversions_by_bucket.rb’
=> nil
[6] > Reductions::ConversionsByBucket.hello
=> “hello”

I created a test app that highlights the problem:

https://github.com/jtushman/classloadingissue

Ok figured it out.

The AWS/SW gem overwrites Module#const_missing – and messes with
things if you class ends in ‘Bucket’. Man, that was a great use of 6
hrs. No idea why it only happens when coupled with
InheritedResources, but that clearly is the root of the problem.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs