RubyとRailsのデバックとコンソールと仲良くする話

これは「 フィヨルドブートキャンプ Part 1 Advent Calendar 2022 」の3日目の記事です。 昨日はsadanoraさんの音読が良かった話でした。

フィヨルドブートキャンプの今年のアドベントカレンダーはこちら。

独学で勉強してるとデバッグしながら作っていくっていう発想になかなかたどり着かず、ネットの参考記事も「こうしたらできました」みたいな記事が多いので余計に「なぜそれで動くのか?」みたいなところが見えづらいように思います。

なので、今日はRubyRailsのデバックについて書いてみようと思います。

この記事はこんなひと向け

  • プログラミング勉強しているけど、いつも何が原因で動かないのかわからなくなって詰んでしまう(ヽ´ω`)
  • 公式ドキュメントを読んでみるけど、メソッドがどんな動きをしているのかいまいちよくわからない(´・ω・`)
  • そもそもデバックが何なのかよくわからない……

自分も勉強したての頃、デバッグツールやコンソールの使い方がよくわからないし、「小さめのコードを確認しながらプログラミングしていくんです」とか言われても「へぇ(なんのこっちゃ)」って思っていました。

一回ツールの使い方を覚えると難しいことではなく、むしろ「ツールがなかったら仕事にならん、お前がいてよかった」くらいに思えるくらいコーディングが捗るようになるので、おすすめです。これでもうメンターさんに「ksmさんのコード、コピペですか?」なんて言わせない。(言われたことをまだ悔しく思ってる)

デバックができるようになると世界が変わるかもしれません。

irb

  • library irb (Ruby 3.1 リファレンスマニュアル)
  • Rubyのコンソール
  • スクリプトを書いてる途中で、最小のメソッドをコンソール上で試し書き→想定通りの動きだったら、スクリプトファイルに書き写していく→最小のメソッドをコンソール上で試し書き→スクリプトファイルに(以下略)を繰り返していくのに便利
  • いきなりスクリプトファイルに長文書いて、実行したら失敗した〜 😫みたいなのはツラいので、👆みたいなやり方をすると気が楽だし、なんか小さな成功体験を繰り返してるみたいになってきて楽しくなる(自分はそうだった)
    • スクリプトが大きくなってくると、binding.irbを使ったほうが早かったりもするので、よしなに使い分けるのが良いと思う
  • ドキュメント読みながら、使ったことなかったり知らないメソッドとかライブラリをお試しするときに使うのも便利
    • 自分は文字を読んだだけだと「はぁ……何のことを言ってるのかサッパリサッパリ〜」なので、動かしてみないと理解できない人類

binding.irb

  • Binding#irb (Ruby 3.1 リファレンスマニュアル)
  • スクリプトを書いてる途中で「おや?思った通りの結果にならないな?」ってなった時に便利
  • binding.irbと書いた部分で実行が一時停止され、コンソール画面(irb)に移る
  • コンソールで、一時停止された時点での変数に入ってる値やメソッドで返ってくる結果を確認してみたりすると「なぜ想定している結果と違う結果になるのか?」がわかるので、コーディングが捗る

Rails console

  • コマンドラインツール - Railsガイド
  • Railsのコンソール
    • 動いているのはirbなんだけど、現場によってはpry-rails(Gem)を使ってたりするところもある。でも……多分できることは大体同じ……じゃないかな(pryはあんまり使わないので…よくわかってない)
  • RailsActiveRecordのモデルや、メソッドが試せるのでないと困る
  • 個人的には既存のプロダクトアプリのDBのカラムとか、モデルを確認するのに重宝してる。(たぶんそういうもんだと思う)
    • 10歳とか迎えてるRailsアプリ(プロダクト)だと、コード読んだだけじゃ何がどこにあるのかわからないのでrails cで確認しながら「へー、こうなってんのかー」みたいなことをよくやる

うっかりアドベントカレンダーの下書きを忘れて岡本太郎展と国宝展の予定をぶち込んでしまい 急ぎ足で記事を書いたので全体的に箇条書き構成で読みづらいことになってたら申し訳ないです。師走でいろんな予定が詰め込まれてるので……落ち着いたらもう少し体裁を整えたり、画面キャプチャとか追加できたらと思います。

セーラームンミュージアム冨樫義博展も行きたい……行けるのかな…行けたら良いな。

ほかにも「こんな活用法もあるよ!」っていうのがあったら知りたいので、コメントとかTwitterのリプとか歓迎です。