Recently I noticed that the present? method was exhibiting weird behaviour on one of our models.

Chapter.new.present?
 => false # wut!?

source_location

After the initial panic wears off, the sane thing to do in this situation is to find out what present? is actually doing. Fortunately, Ruby 1.9+ allows us to find exactly where a method is defined: source_location !

Chapter.new.method(:present?).source_location
 => [".../gems/activesupport-4.1.12/lib/active_support/core_ext/object/blank.rb", 16]

So far so good. present? is defined by ActiveSupport just like we expect it to be. But let’s confirm ActiveSupport’s definition.

def present?
  !blank?
end

def blank?
  respond_to?(:empty?) ? !!empty? : !self
end

And now back to our console again…

Chapter.new.method(:empty?).source_location
 => [".../app/models/chapter.rb", 25]

Aha! We do indeed have a bogus re-definition of ActiveSupport. A quick fix later and everything is behaving normally.

Chapter.new.present?
 => true

TIL

In a big app with lots of gems it can be hard to know exactly where a method is defined, especially since it can be overwritten and redefined numerous times. Ruby, as always, makes it easy.