[Rails] Why does Object.const_defined?() returns false in this case?

93 views
Skip to first unread message

ms

unread,
May 11, 2010, 4:32:54 PM5/11/10
to Ruby on Rails: Talk
Hi,

thank you for reading my post. I'll shortly describe my problem.

I want to probe if a class is defined, and if it is, I want to
instantiate it. Let's assume, the class name is "DemandType" and it
exists:

Object.const_defined?("DemandType") => false
Object.const_get("DemandType") => Class

Why does const_defined?() returns false in this case? I have also
tested it in rails console, but it was not successful. I could also
work with const_get() alone and catch the NameError exception, but I
would really like to know why const_defined?() is not working.

Thank you very much in advance!
ms

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonra...@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Frederick Cheung

unread,
May 11, 2010, 6:19:53 PM5/11/10
to Ruby on Rails: Talk


On May 11, 9:32 pm, ms <m...@tzi.de> wrote:

> Object.const_defined?("DemandType") => false
> Object.const_get("DemandType") => Class
>
> Why does const_defined?() returns false in this case? I have also
> tested it in rails console, but it was not successful. I could also
> work with const_get() alone and catch the NameError exception, but I
> would really like to know why const_defined?() is not working.
>
Are you in development mode ? If so classes aren't loaded until they
are needed. const_defined? is returning false because the class does
not exist in memory. const_get triggers Rails' const_missing handler
which loads the class (and so const_get can then return it)

Fred

ms

unread,
May 11, 2010, 6:53:11 PM5/11/10
to Ruby on Rails: Talk
Thanks for the quick answer! Yes, I am in development mode and this is
actually the problem as you described. How can I force Rails even in
development mode to load ALL classes, is that possible?

Thank you,
ms

Frederick Cheung

unread,
May 12, 2010, 4:46:14 AM5/12/10
to Ruby on Rails: Talk


On May 11, 11:53 pm, ms <m...@tzi.de> wrote:
> Thanks for the quick answer! Yes, I am in development mode and this is
> actually the problem as you described. How can I force Rails even in
> development mode to load ALL classes, is that possible?

As far as I know there's not a nice way of doing this in general
without losing class reloading
If there's only a subset of classes for which this is important you
could stick a bunch of calls to require_dependency at the bottom of
application_controller.rb

Pavel Ravits

unread,
May 12, 2010, 8:05:41 AM5/12/10
to rubyonra...@googlegroups.com

Rick DeNatale

unread,
May 12, 2010, 1:23:16 PM5/12/10
to rubyonra...@googlegroups.com
On Tue, May 11, 2010 at 6:53 PM, ms <m...@tzi.de> wrote:
> Thanks for the quick answer! Yes, I am in development mode and this is
> actually the problem as you described. How can I force Rails even in
> development mode to load ALL classes, is that possible?

It's not really even a development vs production environment question.
Rails in general loads missing constants when referenced. The
difference in the development environment is that it cleans them out
between requests.

Why do you need to use const_defined? Just refer to the class by name
and let Rails do it's thing.


--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Github: http://github.com/rubyredrick
Twitter: @RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

Frederick Cheung

unread,
May 12, 2010, 2:17:08 PM5/12/10
to Ruby on Rails: Talk


On May 12, 6:23 pm, Rick DeNatale <rick.denat...@gmail.com> wrote:
> On Tue, May 11, 2010 at 6:53 PM, ms <m...@tzi.de> wrote:
> It's not really even a development vs production environment question.
> Rails in general loads missing constants when referenced. The
> difference in the development environment is that it cleans them out
> between requests.
>

Actually Rails loads just about everything ahead of time in production
since 2.2 or 2.1 (don't remember which) as part of the thread safeness
work. The const_missing hook is still there, it is just unlikely to
get used in production

Fred
Reply all
Reply to author
Forward
0 new messages