I have a bunch of code to look at, and now it is debugging time. Since I have never been a fan of Ruby's debugger I am looking for a way of going through code and reading it.
What I am trying to do is get the location of the file where a loaded class is defined:
Foo::Bar.create(:param) # how can I know file location in runtime?
For smaller, better organized, projects, I would just search for class Bar
but here that is not possible since there are many classes named Bar
, and, to make matters worse, some of them are under the same namespace. I know, it's trouble waiting to happen.
Note: I'm using Ruby 1.8.7.
For Methods
and Procs
Ruby 1.9 has method called source_location:
Returns the Ruby source filename and line number containing this method or nil if this method was not defined in Ruby (i.e. native)
So you can request for the method:
m = Foo::Bar.method(:create)
And then ask for the source_location
of that method:
m.source_location
This will return an array with filename and line number.
E.g for ActiveRecord::Base#validates
this returns:
ActiveRecord::Base.method(:validates).source_location
# => ["/Users/laas/.rvm/gems/ruby-1.9.2-p0@arveaurik/gems/activemodel-3.2.2/lib/active_model/validations/validates.rb", 81]
For classes and modules, Ruby does not offer built in support, but there is an excellent Gist out there that builds upon source_location
to return file for a given method or first file for a class if no method was specified:
EDIT: For Ruby 1.8.7 there is a gem that backports source_location
:
FYI, In Rails's console or debugging sessions of Rails apps, you can find out the disk-location of the file where that particular class is defined. like
> show-source Job
this will give you
From: /home/john/projects/iisifix/app/models/job.rb @ line 13:
Class name: Job
Number of monkeypatches: 6. Use the `-a` option to display all available monkeypatches
Number of lines: 66
class Job < ApplicationRecord
belongs_to :quote_request
belongs_to :garage
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