Railsガイドにきちんと目を通して新しい知識を得る - Rails アプリケーションのデバッグ編 -

ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。

今回は、Rails アプリケーションのデバッグの章です。

railsguides.jp

SQLクエリコメント

リンクはこちら

ログに出力されるSQLクエリログに、どのコントローラのどのアクション起因かというのが表示されます。
SQL実行に無駄がないか(結果をキャッシュできる箇所がないか)など調査するのに便利そうですね。

config.active_record.query_log_tags_enabled = true
SELECT "books".* FROM "books" /
*action='index',application='Myapp',controller='books'*/  ← この情報が追記される

debug gemによるブレークポイント

リンクはこちら

breakで行数や実行コードを指定して処理を止める

binding.bdebuggerで処理を止めた後、break 18b 18で行数で処理を止められます。
また、b Book.newのようにすると、呼ばれたnewメソッドで処理が止まるようになります。

gemのソースコードを読んだりするときに今まではdebuggerで処理を止めたところからジャンプ先にまたdebuggerを設定して、、とやっていましたが、これを上手に使えば楽になりそうです。

watchインスタンスの変化があった場合に処理を止める

watchを使うことで、オブジェクトに変化があった場合に処理を止めてくれます。
ちなみにActiveRecordインスタンスを指定した際には、インスタンスの属性が変わっただけでは処理は止まりませんでした。

def index
  debugger # ここで止まった時に、`watch @book`とする
  @book = Book.first # nil から インスタンスが入るので処理が止まる
  @book.title = '変更'  # 属性が1つ変わるだけでは止まらない
  @book = :book # シンボル:bookに変わるので止まる
end