It's been a long time since I last used RubyMine, but I always felt that it was the weakest of the JetBrains tools. And not because JetBrains didn't try hard enough, but because Ruby just doesn't offer a lot of opportunities for an IDE to take advantage of.
I ended up cancelling my subscription over some trivial thing (I think it was the fact that I couldn't quite get the IDE to preserve the indentation of a file. It was an all-or-nothing global setting, but I work on codebases that might have a 4-space indent HTML file and a 2-space indent HTML File in the same directory, and the IDE was ignoring the current style of the file and using whatever indent level I had configured).
It might be the weakest of the jetbrains IDEs[0], but for a long time it was simultaneously the best Ruby IDE for my needs. It had reliable jump to definition when nobody else did. That was key for me circa 2015 when I was coming from Java and struggling with my first dynamically typed language since Perl. There are probably better Ruby editors out there now. I stick with RubyMine because I use jetbrains for other languages and like the consistency.
[0] I won’t say the weakest of their tools because youtrack exists.
> [0] I won’t say the weakest of their tools because youtrack exists.
I realized something shocking while nodding along to your observation: they are a dev-tools company, and made their own issue tracker, but I still have to populate every single field, by hand, when reporting a bug against one of their products. But they have total control over the content emitted by RubyMine > About in order to package up the "what, exact, release and platform is the user on". Ironically, I could file that as a YouTrack against the YouTrack product if I enjoy spitting into the wind
Then you realize how this actually discourages interaction with bug reports and feature requests.
I've added "look how active and healthy the bug reporting and feature request systems are" to my checklist for tool evaluation.
In general it's impossible to "find usages" or "go to definition" when the language not only fails to equip IDEs and tooling with the static typing information that would grant definitive answers to such questions; but even goes further and allows methods to be redefined or even synthesized and defined, for the first time, at runtime, with no corresponding source location or file. Method lookup and dispatch are fully Turing complete (you can `#send` anything, including fully dynamic method names, and respond to any message with arbitrary logic in `#method_missing`), and you can even redraw the method lookup chain and inheritance hierarchies at runtime (includes, mixins, module prepend, eigenclasses et al).
This is not a failing of JetBrains tooling but rather a pervasive language smell and consequence of Ruby philosophy.
It is infrequent that "find usages" and "go to definition" don't work for me on good sized ruby code bases. Both solargraph and ruby-lsp seem to work fine for me. Occasionally, I'm surprised when they don't work. In my recent mileage, that happens once every couple weeks, and I use find references and go to definition multiple time per-hour.
Metaprogramming has fallen out of fashion in the ruby community for the most part. Rails is a great example of where that shift has happened. ActiveRecord used to have `find_by_<attr-name>(<value>)`, which became `find_by(<attr-name>, <value>)`. Sure devs can still go wild with metaprogramming in ruby, but it is generally discouraged.
They work well enough to a first approximation, but it's far from the certainty one has using other JetBrains products (e.g. C# ReSharper) on a statically typed codebase.
RubyMine will give you "Untyped (potential) usage." That's not good enough if I need to make a breaking API change and be sure that I've fixed all the callsites, such that I don't find out that I've missed a spot when the change breaks in production.
For all this talk about LLMs and AI improving developer productivity - what is one click and a few seconds in ReSharper to "Change Signature" or "Pull Members Up," which is a 100% guaranteed safe refactoring that will not introduce regressions, ends up being anywhere from "a few hours" of playing whack-a-mole with usage sites, to "completely intractable" in 15+ year old 1MLOC+ codebases making heavy use of metaprogramming.
If the Ruby milieu has turned against metaprogramming, I say good riddance; but my understanding is that it is still quite deep in technologies like Rails and RSpec in particular, where it's the fundamental secret sauce that enables convention-over-configuration and fluent, natural-language like DSLs.
Of course it takes some heuristic to jump to the definition of these common Rails idioms
or a Ruby send(:method, arg)But an IDE specialized in Ruby can do it. No idea if RubyMine does it.
Bonus for handling
In general it can only present a menu of choices: all the methods with a name starting with "method_""Find usages" and "Go to definition" work very well in RubyMine in my experience, at least in normal Rails projects - I use them all the time with command-click.
Anecdata that something is effective in 98% of cases is different from provable static verification that works 100% of the time.
> In general it's impossible to "find usages" or "go to definition"
> Anecdata that something is effective in 98% of cases is different from provable static verification that works 100% of the time.
Ruby has its faults. But you're not making sense complaining first about the "in general" situation, then complaining about a 2% situation. And it is a 2% situation, I'll add my anecdata as verifying 98% (or better) it works really well.
Secondly, you're mixing concepts of static typing and metaprogramming by saying "the language not only fails to equip IDEs and tooling with the static typing information that would grant definitive answers to such questions." Static typing is not the solution, or at least not the only solution, to metaprogramming concepts. For example, if I statically define a Ruby object via RBS, I may still do the things you list that are problematic.
Thirdly, you're complaining about runtime issues making things difficult for the IDE while doing a lookup. What language and IDE do you prefer that does this so much better?
Lastly, I doubt this will help but just to make you aware there are specific rules about how this stuff works, for example https://ruby-doc.org/3.4.1/syntax/calling_methods_rdoc.html#...
It's been a really long time since I last used RubyMine as well, but one of my complaints back then was that it didn't help much when trying to debug code that made heavy use of metaprogramming. Maybe capabilities have improved since then. Despite that limitation, RubyMine still provided a far better debugging experience than what could be achieved through the default ruby debugging tools.
Yeah, Ruby wasn’t unpleasant to write in the wonderfully simple TextMate back in the day… a full fat IDE feels like extreme overkill.
I might even say that’s a point of attraction for the language. Overwrought IDEs and heavy editors are more optional relative to some languages.
I have worked at several ruby shops and everyone has used heavy IDEs like RubyMine and VSCode, jump to's and language server are far too important.
Dunno, if you're using Rails, because of the naming conventions its pretty easy to find what you're looking for by just jumping to a file using grep or something.
Ruby-lsp runs everywhere nowadays, but back in the day, there was all sorts of code completion servers, live coding environments, etc... for Emacs, Vim had completion servers, and if you didn't have any of those, the REPL has always been good too.