ume

rubyのデバックのやり方

前書き

rubyを学習して数ヶ月経つ初心者なのですが、毎回エラーに遭遇すると非効率に時間を費やしてしまい学習効率を落とします。その原因として、エラーの原因より解決策をネットで探し回り、また同じエラーに遭遇すると「このエラー見たことあるけどなんでこのエラーは起きるんだろうと」思いながらまた、ネットで解決策を探し回ります。少なからず私のような学習者はいると思いますので、今回はエラーの原因がわかり、エラー遭遇から解決までの時間を短縮できるようにエラーの解決手順についての記事を残します。

目次

  1. エラーを解決するためにやるべきこと3つ.
  2. 見方や 使い方.

1. エラーを解決するためにやるべきこと3つ.

①バックトレースの確認.
バックトレースとは.
⇨プログラムが実行されてエラーが発生するまでの間のメソッドの呼び出し履歴を示した情報.
要は「どういう手順でプログラムを動かそうとしたかがわかる情報」.
メリット:エラー解決のための時間が短縮できる。理由は「エラーが起きている箇所を特定しやすい」.

②pデバッグ.
pデバッグとは.
⇨pメソッドをプログラムに埋め込んでプログラムを実行し、ターミナルに出力される値を確認して不具合の原因を探る方法. 要は「この変数に何の値が入ってるんだろう?」と疑問に思ったりしたときに変数の中身を確認できる.

③デバッガを使う.
デバッガとは.
⇨pデバッグをより便利にしたもの.

2. 見方や使い方.

①実際にバックトレース(履歴)の見方について.

バックトレース(履歴)が表示される場所はターミナルやブラウザーなどに表示される。

ターミナルに出力された履歴 ブラウザーに出力された履歴

出力される場所が違うだけで内容はほとんど同じ.

ただrubyのバージョンによって表示内容が変わることがある。

バックトレースの内容は『間違っている箇所』と「間違っている理由」が含まれています。 要は「どこのファイルの何行目がどのように間違っているかを教えてくれます」 ターミナルとブラウザー両方の履歴を見ると

app/controllers/users_controller.rb:22:in 'update_password'

と記載があります。これがエラーを起こしている場所です。users_controllerファイルの22行目あたりのupdate_passwordメソッドがエラーの箇所になります。 次にどのように間違っているかを ターミナル、ブラウザー両方の履歴を見ると

undefined method `password_set?' for #<UsersController:0x00005614f67714b8> 

と記載があります.
undefined=未定義.
method =メソッド.
'password_set?'=メソッド名.
for UsersController =メソッド名が記述されている場所.
全体的な意味はUsersControllerで使われているpassword_set?メソッドなんだけど未定義だよと言われている。 要は以下の状態でプログラムが実行されている状態.

if a <= 10 
  puts "10以下です"
else 
  puts "10以上です"
end

このプログラムを動かそうとするとエラーになります。なぜなら[a]って何?となるからです.
今回のundifinedエラーに関してはメソッドや変数を定義してあげたら解決します。

a = 5
if a <= 10 
  puts "10以下です"
else 
  puts "10以上です"
end
⇨”10以下です”が出力される

こうすれば人間もpcもa=5とわかるのでエラーが解決されます.

②pデバッグの使い方について.

知りたい変数やメソッドの値の後に

p 変数名やメソッドの値を入れる

例えば. コントローラの中にあるcitiesメソッドの引数namesに入っている値が知りたいとします。 その場合namesの後にp namesと入力し、ページをリロード(更新)します。 するとターミナルに["osaka","tokyo"]と出力されます。*namesの中に["osaka","tokyo"]が入っていることがわかりました。

またpデバッグは変数やメソッドの値を知りたい時に使用するほか「メソッドや条件分岐が意図した通り」に動いているかどうかを知りたい時にも使えます.
例citiesメソッドが呼ばれているか条件分岐がtrueの処理がちゃんと行われているか知りたいとする.
citiesメソッドが呼ばれているか知りたいときはメソッド名の直後にpデバッグを使って好きな文字を入れていみる.
また条件分岐のtrueの処理が行われているか知りたいときも同様でtrueの処理の中にpデバッグを差し込む。 なお今回もしメソッドがちゃんと呼ばれていたら ”citiesメソッドが呼ばれた” trueの処理の場合"trueの処理が行われたとターミナルに出力される.
メソッドもtrueの処理も呼ばれていると確認できる

③デバッガを使う方法.

デバッガーとはpデバックの進化系であり、役割はpデバッグと同じで変数やメソッドの値の確認することができるツール。pデバックの違いは、デバッガーの方が楽に変数の中身が知れる。 デバッガの種類あるので今回はrailsにデフォルトで入っているbyebugの説明をすることとする。 pデバッグと同じように知りたい変数の後に「byebug」と入力しページをリロードすると ターミナルにこのように出力される 『=>13』の意味はここで処理を止めているよという意味、byebugを使うとbyebugの直後で処理を止めることができ(byebug)の後に好きな変数を入れると、その変数の中身が出力される。