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
end
end
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
ActiveSupport::Inflector.demodulize(self)
end
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]
else
path
end
end
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.