Implement "go to definition" for render calls in ERB templates
#659
+248
−18
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
It's common to want to traverse through several partials while updating HTML that a controller action renders. Rails.vim has a neat
gfshortcut for this, though it probably doesn't have the precision that Prism would provide. This brings the same functionality to Ruby LSP Rails, by implementing "go to definition" support forrendercalls inside ERB templates.Screen.Recording.2025-10-28.at.21.08.51.mov
It supports partial name passed as positional argument, or via
:partial,:layout, and:spacer_templatekeyword arguments. It even handles:variants,:formats, and:handlersoptions, as well as:templatefor rendering non-partial templates. Relative lookup will also check in view directories of controller ancestors.For the latter, I considered doing a call to the Rails process that will return
ActionController::Base._prefixes. However, I couldn't think of a good enough interface, and that method ableit public is undocumented, so it seems like we shouldn't rely on it. Given that this ancestry lookup is non-configurable anyway, I chose to implement it in Ruby LSP land based on indexed controller files.To avoid the overhead of booting the Rails process too many times in tests, I updated the test helpers to allow sending multiple
textDocument/definitionrequests to the same server.