Ruby 1.9 changed the default behavior of Module.const_defined? from what it was in Ruby 1.8 -- this can be especially painful when external code (read: gems) uses const_defined? to look something up and gets different results on different Rubies.
Consider this:
module Foo
  FOO = 42
end
class Bar
  include Foo
end
On 
  Ruby 1.8
  
    Show archive.org snapshot
  
, Bar won't have FOO defined as a constant since that's (even though it's accessible):
1.8.7 > Foo.const_defined? :FOO
 => true 
1.8.7 > Bar.const_defined? :FOO
 => false 
1.8.7 > Bar::FOO
 => 42 
  Ruby 1.9
  
    Show archive.org snapshot
  
 introduces a switch (defaulting to true) that also looks at the ancestor classes/modules. This leads to different results:
1.9.3 > Foo.const_defined? :FOO
 => true 
1.9.3 > Bar.const_defined? :FOO
 => true 
1.9.3 > Bar::FOO
 => 42 
To get the old behavior back, you need to pass false as a second option:
1.9.3 > Bar.const_defined? :FOO, false
 => false 
Posted by Arne Hartherz to makandra dev (2013-03-01 12:27)