Complete Guide to setup VS Code for Ruby on Rails (Debugger, Linter, Completion, Formatting)
Tags: ruby, rails, vscode, tooling
Published: 2022-01-06 15:16:43

This article explains how configure **Visual Studio Code** debugger and language server for your Ruby or Ruby on Rails project. After setup you will be able to debug and navigate through Ruby code like an in RubyMine but for free :).

## Motivation

When I tried to configure Ruby debugger for the first time, I read many articles and tutorials but don't found how get things done when Ruby installed through *asdf* / *rbenv* or another version manager. Problems with relative paths, terminal environments, conflicts with existed ruby and gems versions. 
Lets try to fix that and build isolated environment for our project.

## Requirements
1. [VS Code](https://code.visualstudio.com/) with plugins [#1](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby), [#2](https://marketplace.visualstudio.com/items?itemName=castwide.solargraph)
2. Ruby installed through **rbenv** or **asdf**, Bundler.


## Project setup
### Dependencies
Add to your Gemfile:

```ruby
group :development, :test do
  gem "ruby-debug-ide", require: false
  gem "debase", require: false
  gem 'solargraph', require: false
end
```

and run 
```
$ bundle install
```
### Ruby version
Create `.ruby-version` file in root of project if it not already exists. 

```sh
$ echo "3.0.2" > .ruby-version
```

### Binstubs
Generate bintubs for gems which will be very useful later:
```sh
$ bundle binstubs bundler ruby-debug-ide solargraph
```

Binstub for test library (rspec for example):

```sh
$ bundle binstubs rspec-core
```

After all in `bin` folder you will see 4 new files: `rdebug-ide`, `gdb_wrapper`, `bundle`, `rspec`, which will be used in VS Code configuration files.

### Launch and Settings
Copy to `.vscode/launch.json`
```json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Start rails server",
      "type": "Ruby",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "program": "${workspaceFolder}/bin/rails",
      "useBundler": true,
      "pathToBundler": "${workspaceFolder}/bin/bundle",
      "showDebuggerOutput": true,
      "pathToRDebugIDE": "/${workspaceFolder}/bin/rdebug-ide",
      "args": ["s"]
    },
    {
      "name": "Run tests",
      "type": "Ruby",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "program": "${workspaceFolder}/bin/rspec",
      "useBundler": true,
      "pathToBundler": "${workspaceFolder}/bin/bundle",
      "showDebuggerOutput": true,
      "pathToRDebugIDE": "/${workspaceFolder}/bin/rdebug-ide",
      "args": []
    }
  ]
}
```
Copy to `settings.json`
```json
{
    "solargraph.commandPath": "bin/solargraph",
    "solargraph.formatting": true,
    "editor.formatOnSave": true,
    "solargraph.diagnostics": true,
}
```

## Result
We configure debugger,language server for completion, linting & formatting. Our config  depends only on project binstubs, works as expected, and don't conflicts with other environments, because all stuff stores in project folder.
In the future, the config can be easily transferred to another project. 

If this article be helpful for you,i will be happy if you add reaction and post link to your favourite social media, thanks!