なぜ記事を書こうと思ったか
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(#<UsersController>)>
上記のログでは、=>
が書いてある行以前まで、コードが動いている事を表します。
また、[1] pry(#<UsersController>)>
でrailsコンソールの時と同様の操作ができます。
[1] pry(#<UsersController>)> params[:name]
=> "田中太郎"
5.次の行のコードまで動作させたい場合は、nextと入力する。
[2] pry(#<UsersController>)> 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(#<UsersController>)>
先ほどまでは4行まで動作していましたが、今回は10行まで動作した状態になります。
このような作業をするだけで各コードが適切に動作しているか確認することができます。
デバッグ終了方法
1.continue
を入力して、止まっていたコードを全て動作させる。
[3] pry(#<UsersController>)> continue
~~~ログが流れる~~~
2.controlボタンを押しながら、pの後にqを押す。
こうすることで、コンテナから出ることができます。もし、exit
やcontorol + c
をした場合は、サーバーも停止されます。
3.binding.pry
を削除します。
最後に
自分は、logger.debug
やログで動作状況を確認していたので、このデバッグ方法は非常に便利に感じました。是非、やった事がない方はやってみる事をお勧めします。もし、もっと良いデバッグ方法がある場合は、コメントで教えていただけると嬉しいです。読んで頂きありがとうございました。