How do I turn a string into a class name, but only if that class already exists?
If Amber is already a class, I can get from a string to the class via:
Object.const_get("Amber")
or (in Rails)
"Amber".constantize
But either of these will fail with NameError: uninitialized constant Amber
if Amber is not already a class.
My first thought is to use the defined?
method, but it doesn't discriminate between classes that already exist and those that don't:
>> defined?("Object".constantize) => "method" >> defined?("AClassNameThatCouldNotPossiblyExist".constantize) => "method"
So how do I test if a string names a class before I try to convert it? (Okay, how about a begin
/rescue
block to catch NameError errors? Too ugly? I agree...)
We can check for the existence of a class using Java Reflection, specifically Class. forName(). The documentation shows that a ClassNotFoundException will be thrown if the class cannot be located.
How about const_defined?
?
Remember in Rails, there is auto-loading in development mode, so it can be tricky when you are testing it out:
>> Object.const_defined?('Account') => false >> Account => Account(id: integer, username: string, google_api_key: string, created_at: datetime, updated_at: datetime, is_active: boolean, randomize_search_results: boolean, contact_url: string, hide_featured_results: boolean, paginate_search_results: boolean) >> Object.const_defined?('Account') => true
In rails it's really easy:
amber = "Amber".constantize rescue nil if amber # nil result in false # your code here end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With