はじめに
Rails開発をしていると、
- 処理がどのように流れているのか分からない
- Serviceクラスの中で何が起きているのか確認したい
- GraphQLのリクエストを1行ずつ追いたい
という場面があります。
そのようなときに便利なのがVS Codeのデバッグ機能です。
今回はWSL上で動作するRailsアプリをVS Codeからデバッグ実行する方法と、実際に遭遇したトラブルの解決方法を紹介します。
環境は以下を想定しています。
- Windows
- WSL(Debian/Ubuntu)
- Ruby on Rails
- VS Code
- GraphQL
デバッグを導入する目的
例えばGraphQLのリクエストが実行された際、
GraphQL Query
↓
Resolver
↓
Service
↓
Repository
↓
Response
の流れを追いたいことがあります。
通常のログ確認だけでは分かりにくい処理も、
- 現在の変数の値
- 呼び出されるメソッド
- 処理の流れ
を1行ずつ確認できます。
事前準備
Ruby Debug拡張機能をインストール
VS Codeの拡張機能で以下をインストールします。
VSCode rdbg Ruby Debugger
提供元
Koichi Sasada
debug gemを確認
Gemfileに以下が存在することを確認します。
group :development do
gem "debug"
end
なければ追加してインストールします。
bundle install
launch.jsonを作成する
VS Codeで
Run and Debug
↓
create a launch.json
を選択します。
作成されたファイルを以下のように編集します。
{
"version": "0.2.0",
"configurations": [
{
"type": "rdbg",
"name": "Debug Rails",
"request": "launch",
"script": "bin/rails",
"args": ["server"],
"cwd": "${workspaceFolder}",
"env": {
"RAILS_ENV": "local"
}
}
]
}
各設定の意味
type
"type": "rdbg"
Rubyの標準デバッガーを利用します。
request
"request": "launch"
新しくRailsプロセスを起動します。
script
"script": "bin/rails"
実行対象のファイルです。
args
"args": ["server"]
最終的に以下が実行されます。
bin/rails server
env
"env": {
"RAILS_ENV": "local"
}
実行環境を指定します。
ここが今回一番重要なポイントでした。
ブレークポイントを設定する
確認したい行番号の左側をクリックします。
赤い丸が表示されればOKです。
例
def execute(user_id:)
service = SampleService.new
result = service.call(user_id)
result
end
デバッグを開始する
F5キーを押します。
正常に起動するとデバッグコンソールに
=> Booting Puma
=> Rails application starting
が表示されます。
GraphQLを実行する
GraphQLクライアントやAPIツールからリクエストを送信します。
例
query {
sampleData(id: 1) {
name
}
}
ブレークポイントに到達すると処理が停止します。
よく使う操作
| キー | 内容 |
|---|---|
| F5 | 続行 |
| F10 | 次の行へ |
| F11 | メソッド内部へ入る |
| Shift+F11 | メソッドから戻る |
特にF11は非常に重要です。
service.call
でF11を押すと、
def call
の中へ移動できます。
Variablesで値を確認する
停止中は左側のVariablesから変数を確認できます。
例
user_id
↓
1
ハマったポイント
今回一番苦戦したのが以下のエラーでした。
ActiveRecord::ConnectionNotEstablished
connection refused
原因
普段は
bin/dev
で起動していました。
しかしVS Codeのデバッグは
bin/rails server
を直接実行します。
その結果、
local環境
ではなく
development環境
で起動してしまい、
別のDB設定を参照していました。
解決方法
launch.jsonに環境変数を追加しました。
"env": {
"RAILS_ENV": "local"
}
これで普段の起動方法と同じ環境でデバッグできるようになりました。
まとめ
Rails初心者のうちはログだけで処理を追うのは大変です。
VS Codeのデバッグ機能を利用すると、
- Resolver
- Service
- Model
- 外部API呼び出し
などを1行ずつ確認できます。
特にF11によるステップインは、Railsの処理フローを理解するために非常に役立ちます。
最初は設定に少し苦戦するかもしれませんが、一度環境を整えてしまえば開発効率が大きく向上するのでおすすめです。