問題点
下記のようにputsメソッドなどでインスタンスを確認しようとすると、内容までは出力できません。
この問題の解決方法を解説していきます。
user = User.first
puts user
#<User:0x000000011e83a7d8>
解決
Rubyには先述の問題点を解決するいくつかのメソッドが用意されています。
inspectメソッド
inspectメソッドは、オブジェクトを人間が読める形式に変換した文字列を返します。
[ 1, 2, 3..4, 'five' ].inspect # => "[1, 2, 3..4, \"five\"]"
Time.new.inspect # => "2008-03-08 19:43:39 +0900"
# classの変化
[ 1, 2, 3..4, 'five' ].class # => Array
[ 1, 2, 3..4, 'five' ].inspect.class # => String
Time.new.class # => Time
Time.new.inspect.class # => String
これをインスタンスに使うと人間が読める形式で出力されます。もちろん、クラスもStringとなります。
# Userモデルが存在します
User.first
#<User:0x000000011b405e40>
User.first.inspect
"#<User id: 1, email: \"user@example.com\", created_at: \"2023-09-30 10:07:35.631748000 +0000\", updated_at: \"2023-09-30 10:07:35.631748000 +0000\">"
# classの変化
User.first.class # => User
User.first.inspect.class # => String
Object#inspect (Ruby 3.3 リファレンスマニュアル)
オブジェクトを人間が読める形式に変換した文字列を返します。
pメソッド
pメソッドは引数を人間に読みやすい形に整形して改行と順番に標準出力 $stdout に出力するメソッドです。
要するに、inspectメソッド + 出力をしてくれるメソッドです。
コントローラー内などでのデバッグはこのpメソッドがおすすめです。お手軽さもあって、簡単にデバッグができます。
# 下記はputs User.first.inspectと似た動作となる
p User.first
#<User id: 1, email: "user@example.com", password_digest: [FILTERED], created_at: "2023-09-30 10:07:35.631748000 +0000", updated_at: "2023-09-30 10:07:35.631748000 +0000">
Kernel.#p (Ruby 3.3 リファレンスマニュアル)
引数を人間に読みやすい形に整形して改行と順番に標準出力 ] に出力します。主にデバッグに使用します。
注意点
inspectメソッドは出力機能を提供していないので、アクションやメソッド内ではpメソッドを使うようにしましょう。
逆にコンソールで出力を試す場合には、inspectメソッドを使っても良いかもしれません。
引用・参考資料
Object#inspect (Ruby 3.3 リファレンスマニュアル)
オブジェクトを人間が読める形式に変換した文字列を返します。
Kernel.#p (Ruby 3.3 リファレンスマニュアル)
引数を人間に読みやすい形に整形して改行と順番に標準出力 ] に出力します。主にデバッグに使用します。