The following example fails
class A
class B
end
end
p Object.const_get 'A' # => A
p Object.const_get 'A::B' # => NameError: wrong constant name A::B
UPDATE
Questions about the topic asked earlier:
The last one gives a nice solution which can be evolved into
class String
def to_class
self.split('::').inject(Object) do |mod, class_name|
mod.const_get(class_name)
end
end
end
class A
class B
end
end
p "A::B".to_class # => A::B
Here is Rails'
constantize
method:See, it starts at the
Object
on top of it all, then uses each name in between the double semicolons as a stepping stone to get to the constant you want.You can do this with eval also which works in some cases where const_get won't. There's a good article on this here: http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html#.T8j88HlYtXc
You'll have to manually "parse" the colons yourself and call
const_get
on the parent module/class:Someone has written a
qualified_const_get
that may be of interest.Extlib provides a
full_const_get
method, which does just this.http://github.com/datamapper/extlib/blob/master/lib/extlib/object.rb#L67
You could either include extlib, or copy this implementation and use it yourself (assuming the licensing is compatible with whatever you're using it for)