Rails及びDocker環境でのpry-railsのデバッグ方法
なぜ記事を書こうと思ったか
Rails及びDocker環境でpry-railsでのデバッグをおこなったので、そのやり方を記載致します。
これまで、行っていたデバッグよりもより細かくコードを確認できるので、すごく便利に感じたので、多くの新人の方が使ってくれると嬉しいです。
Rails及びDocker環境でpry-railsでのデバッグ手順
※Dockerは構築して、起動してある事を前提として記載致します。
デバッグ手順
1.Railsのコードで動作を止めて、確認したいコードの直後にbinding.pry
を追加します。
今回は例として、createメソッドのコードに付け足したいと思います。
def create permit_parameters = params.permit(:name, :age, :sex).to_h binding.pry user = User.create!( name: permit_parameters[:name].to_i, age: permit_parameters[:age], sex: permit_parameters[:sex] ) return_json = { "#{ user.name }さんの登録を受け付けました。" } render json: return_json end
上記のようにするだけで、permit_parameters変数の行までしか実行されないようになります。
2.docker ps -a
でDockerで起動しているコンテナの一覧を表示し、Railsサーバーを立ち上げているコンテナのIDを確認します。
3.docker attach コンテナID
を入力し、Railsサーバーを立ち上げているコンテナに入ります。
4.今回の場合はcreateメソッドにデータをPOSTします。
ログと共に、以下のようなログも表示されます。
1: def create 2: permit_parameters = params.permit(:name, :age, :sex).to_h 3: binding.pry 4: =>5: user = User.create!( 6: name: permit_parameters[:name], 7: age: permit_parameters[:age], 8: sex: permit_parameters[:sex] 9: ) 10: 11: return_json = { "#{ user.name }さんの登録を受け付けました。" } 12: render json: return_json 13: end
上記のログでは、=>
が書いてある行以前まで、コードが動いている事を表します。
また、[1] pry(#
でrailsコンソールの時と同様の操作ができます。
[1] pry(#)> params[:name] => "田中太郎"
5.次の行のコードまで動作させたい場合は、nextと入力する。
[2] pry(#)> next 1: def create 2: permit_parameters = params.permit(:name, :age, :sex).to_h 3: binding.pry 4: 5: user = User.create!( 6: name: permit_parameters[:name], 7: age: permit_parameters[:age], 8: sex: permit_parameters[:sex] 9: ) 10: =>11: return_json = { "#{ user.name }さんの登録を受け付けました。" } 12: render json: return_json 13: end [3] pry(# )>
先ほどまでは4行まで動作していましたが、今回は10行まで動作した状態になります。
このような作業をするだけで各コードが適切に動作しているか確認することができます。
デバッグ終了方法
1.continue
を入力して、止まっていたコードを全て動作させる。
[3] pry(#)> continue ~~~ログが流れる~~~
2.controlボタンを押しながら、pの後にqを押す。
こうすることで、コンテナから出ることができます。もし、exit
やcontorol + c
をした場合は、サーバーも停止されます。
3.binding.pry`を削除します。
最後に
自分は、logger.debug
やログで動作状況を確認していたので、このデバッグ方法は非常に便利に感じました。是非、やった事がない方はやってみる事をお勧めします。もし、もっと良いデバッグ方法がある場合は、コメントで教えていただけると嬉しいです。読んで頂きありがとうございました。