on programming Rails for fun and profit...

How to Get an Object's Class Name in Rails

This post explores a few different ways in which you can get an object's class name in both Ruby and Rails.

Let's say you want an object's class name in Ruby. You'd write something like this:

module Bank
  class Account

irb(main):005:0> account = Bank::Account.new
=> #<Bank::Account:0x0000000106115b00>
irb(main):006:0> account.class.name
=> "Bank::Account"
irb(main):008:0> account.class.name.split("::").last
=> "Account"

In Rails, you can use the demodulize method on the string, which is added by Active Support. It removes the module part from the constant expression in the string.

irb(main):014:0> account.class.name.demodulize
=> "Account"

Internally, this method calls the demodulize class method on the ActiveSupport::Inflector class, passing itself as the argument.

# File activesupport/lib/active_support/core_ext/string/inflections.rb, line 166
def demodulize

The Inflector.demodulize function does the same thing.

demodulize('ActiveSupport::Inflector::Inflections') # => "Inflections"
demodulize('Inflections')                           # => "Inflections"
demodulize('::Inflections')                         # => "Inflections"
demodulize('')                                      # => ""

However, its internal implementation is different than our simple version above.

# File activesupport/lib/active_support/inflector/methods.rb, line 228
def demodulize(path)
  path = path.to_s
  if i = path.rindex("::")
    path[(i + 2)..-1]

After converting the path argument to a string, it gets the index of the last occurrence of :: using Ruby's rindex function. If it exists, then it returns the remaining substring. Otherwise, it returns the original string. The array[n..-1] expression returns the substring from n to the last character in the string.

So these are a few ways to get an object's class name in Ruby and Rails. I hope it helped.

Subscribe to Akshay's Blog

Sign up now to get access to the library of members-only issues.
Jamie Larson