finding function defenition

33 views
Skip to first unread message

Ilya Makedon

unread,
Mar 21, 2020, 12:57:48 PM3/21/20
to Ruby on Rails: Talk
How does one figure out where a definition of a function is given its call in Ruby on Rails code?  For example, let's suppose, I didn't know what config/routes.rb is for.  And I was looking at it and wanted to know what the function get does.  It's not defined in routes.rb itself.  There are no includes, requires or inheritance.  How would one know what functions named get are available in that scope and which one of them would be called at runtime?  I'm looking for a systematic way applicable to an arbitrary file in a Rails project calling arbitrary function that could be part of Rails or dependency gem.

When I tried 'Go To Definition' of the get in RubyMines, it popped up a list of about 100 options of what i could be.  Is there an IDE that's better at this than RubyMine?

As for me, I can't even come up with a search terms to get something resembling an answer on google.  That's why I humbly request your help.  thanks.

San Ji

unread,
Mar 21, 2020, 1:35:14 PM3/21/20
to Ruby on Rails: Talk
To my knowledge, what you are looking for is not possible for Ruby.

What you got in RubyMine is the closest, basically it index all words and apply some language heuristics to scope down choices. This is good enough in most cases.

Systematic way to do it is impossible because Ruby supports metaprogramming.
Take ActiveRecord as an example, you got attribute-related methods that defines in databases, not even in Ruby code. If you connect to different databases, the method definitions will be different. Nothing can even point that out (represent that) properly, at least not with user interface of an IDE.

Ilya Makedon

unread,
Mar 21, 2020, 4:36:05 PM3/21/20
to rubyonra...@googlegroups.com
San Ji, thank for your answer.  But how does Ruby runtime know which function to call?  There must be a way for human to mimic that...  Right?

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/63fd8953-f3a8-47a9-a931-17dd2eb3cce4%40googlegroups.com.


--
--------------------------
- Ilya Makedon

Ariel Juodziukynas

unread,
Mar 21, 2020, 8:19:02 PM3/21/20
to rubyonra...@googlegroups.com
One thing you can do is use a gem like byebug, put a breakpoint above the code you want to find it's location and use this:

method(:name_of_method).source_location

if you put a breakpoint inside your routes.rb and call:

method(:get).source_location

it returns something like:

...../gems/actionpack-6.0.2.2/lib/action_dispatch/routing/mapper.rb, 711

Than you can check the source on github


It doesn't always work, you can have methods generated on the fly using define_method for example I'm not sure source_location gives you the right source there.

Reply all
Reply to author
Forward
0 new messages