Rails 7でbin/devでデバッグ時の問題と対処法
Rails 7系でbin/devを使用してサーバーを起動している際に、binding.pryやdebugを利用すると、プロンプトに入力した文字が表示されない問題があります。
具体的には、コードにbinding.pryを挿入しても、入力した文字が見えず、入力が空白のように見えます。
この問題の原因は、Rails 7でbin/devによって使用されているForemanが標準入力を適切にハンドリングできないためです。
現状の対処法
pry-remoteの使用
- Gemfileにgem 'pry-remote'を追加し、bundle installを実行します。
- binding.pryの代わりに、binding.remote_pryをコードに挿入します。
- 別のターミナルから$ pry-remoteを実行すると、そのターミナルでデバッグが可能になります。
デメリット:多くのターミナルを開く必要があり、手間がかかる。
ForemanとRailsサーバーを別々に実行
bin/devを使用すると、Procfile.devがForemanで実行されます。これはCSSおよびJSのウォッチャーによって引き起こされますが、これらはファイルの変更のみを監視するため、サーバー自体には関与しません。
Procfileからweb: unset PORT && bin/rails serverを削除します。これにより、CSSウォッチャーとJSウォッチャーのみが残り、以下のようになります。
js: yarn build --watch
css: yarn build:css --watch
この方法では、2つのターミナルを開く必要があります。
bin/rails s
bin/dev
このセットアップにより、pryはサーバーターミナルで通常通り動作し、ウォッチャーも問題なく機能します。
参考
https://stackoverflow.com/questions/72532475/binding-pry-not-works-with-command-bin-dev
https://scrapbox.io/ruby-jp/bin%2Fdev_%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%A8_debug.gem_%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B