最近覚えたデバッグ方法を、備忘のためにまとめておきます。
ログに出力する
ActiveSupport::Logger#debugメソッドを使って、rails serverの標準出力にデバッグコードを出力する。
logger.debug(‘Hello world’)
SQLを出力する
ActiveRecord::Relation#to_sqlメソッドでSQLを出力する。
User.all.to_sql #=> SELECT “users”.* FROM “users”
ブレークポイントを設定する
コード内にbinding.pry
というコードを書くと、そこまで実行中のプログラムが中断され、
以降をコンソール上からデバッグできます。
Gemfile
gem ‘pry-rails’, group: [:development, :test]
gem ‘pry-byebug’, group: [:development, :test]
$ bundle install
$ rails server
中断したい箇所にbinding.pry
を記述。
def index
@users = User.all
binding.pry # <- This!
logger.debug(‘—— 1 ——-’)
logger.debug(‘—— 2 ——-’)
logger.debug(‘—— 3 ——-’)
logger.debug(‘—— 4 ——-’)
end
ブレークポイントの移動はnext
,step
,exit
で行う。
7: def index
8: @users = User.all
9:
10: binding.pry
11:
=> 12: logger.debug(‘—— 1 ——-’)
13: logger.debug(‘—— 2 ——-’)
14: logger.debug(‘—— 3 ——-’)
15: logger.debug(‘—— 4 ——-’)
16: end
おまけ1 出力結果を見やすく整形する
- pコマンド
p Array.new(10) { {:hoge => :fuga} }
#=> [{:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga}, {:hoge=>:fuga},
{:hoge=>:fuga}, {:hoge=>:fuga}]
- ppコマンド
require ‘pp’
pp Array.new(10) { {:hoge => :fuga} }
#=> [{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga},
{:hoge=>:fuga}]
おまけ2 オブジェクトの情報を出力する
- Object#inspectメソッドでオブジェクトを文字列として出力する。
User.inspect
- オブジェクトのメソッドを出力する
User.methods
- オブジェクト(クラス)の継承関係を出力する
User.ancestors