pry を試す

前回 hirb を試していた時、ググっているとサジェストに pry が出てきていました。
気になったので、こちらも試しました。

目次

参考

pry-rails の導入

前提

Rails アプリケーションを用意してある前提で進めます。

導入

Gemfile に以下を記述する。

Gemfile
1
gem 'pry-rails'

bundle installを実行してインストール。

pry-rails を使ってみる

それでは、pryを Rails Console で使ってみます。
既にusersテーブルと、Userモデルがあるものとします。

1
2
3
4
5
6
7
8
9
10
11
# Rails Console の開始
>bundle exec rails c

# irb(main) => pry(main) に呼び出されているものが変わっている
[1] pry(main)> User.all
=> (0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
User Load (0.2ms) SELECT `users`.* FROM `users`
[#<User:0x0000000007e9e9c0 id: 1, name: "A", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>,
#<User:0x0000000007ea7c28 id: 2, name: "B", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>,
#<User:0x0000000007ea7ae8 id: 3, name: "C", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>]

テーブル表示ではありませんが、適宜改行されて改行されているので hirb よりも見やすいです。
また、上記の記載ではわかりませんが実際のコンソールでは、適宜色が付くのでその点も irb よりもよいと感じます。

pry をデバッグに使う

byebug というライブラリがあり、例えばコントローラの処理の中でbyebugと記述すると、コンソールの処理に移ることができるのだそうです。
このコンソール処理に pry を呼び出します。

pry-byebug を導入

Gemfile に以下を記述する。

Gemfile
1
gem 'pry-byebug'

bundle installを実行してインストール。

pry-byebug を使ってみる

pry-byebug を使うには、ソースコードにbinding.pryを記述します。
記述したコントローラは以下のようになります。

app/controllers/users_controller.rb
1
2
3
4
5
6
7
8
9
10
class UsersController < ApplicationController
def index
u = User.all

# pry-byebugの呼び出し
binding.pry

render json: {users: u}
end
end

上記が用意できたら、ルーティングを記述します。

bundle exec rails sで起動してusers#indexが呼び出されるようアクセスします。
すると、以下のように表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

2: def index
3: u = User.all
4:
5: binding.pry
6:

=> 7: render json: {users: u}
8: end

# コントローラの中で宣言した変数を参照できる!
[1] pry(#<UsersController>)> u
=> User Load (0.4ms) SELECT `users`.* FROM `users`
↳ app/controllers/users_controller.rb:7
[#<User:0x0000000007de38f0 id: 1, name: "A", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>,
#<User:0x0000000007de36c0 id: 2, name: "B", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>,
#<User:0x0000000007de3468 id: 3, name: "C", created_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00, updated_at: Fri, 02 Oct 2020 15:59:36 UTC +00:00>]


# 変数の書き換えもできる
[2] pry(#<UsersController>)> u[2].name="update C"
CACHE User Load (0.0ms) SELECT `users`.* FROM `users`
↳ (pry):2
=> "update C"

# 元の処理にもどるときには exit
[3] pry(#<UsersController>)> exit
Completed 200 OK in 26267ms (Views: 1.7ms | ActiveRecord: 16.2ms)

コントローラの処理に戻ったことで、以下のようにブラウザに表示されます。

1
{"users":[{"id":1,"name":"A","created_at":"2020-10-02T15:59:36.000Z","updated_at":"2020-10-02T15:59:36.000Z"},{"id":2,"name":"B","created_at":"2020-10-02T15:59:36.000Z","updated_at":"2020-10-02T15:59:36.000Z"},{"id":3,"name":"update C","created_at":"2020-10-02T15:59:36.000Z","updated_at":"2020-10-02T15:59:36.000Z"}]}

Cの記述が書き換え後のupdate Cになってレスポンスが返りました。

hirb と pry の共存

また、Rails Console を pry に切り替えた時、Hirb.enable で有効化しても動作しませんでした。
共存する方法が記載されていたので試します。

.pryrcをプロジェクトルート(Gemfile が置かれている場所)に作成し、以下の取り記述します。

.pryrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
begin
require 'hirb'
rescue LoadError
# Missing goodies, bummer
end

if defined? Hirb
# Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
Hirb::View.instance_eval do
def enable_output_method
@output_method = true
@old_print = Pry.config.print
Pry.config.print = proc do |*args|
Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
end
end

def disable_output_method
Pry.config.print = @old_print
@output_method = nil
end
end

Hirb.enable
end

用意できたらアプリケーションを再起動しusers#indexが呼び出されるようアクセスします。
すると、以下のように表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

2: def index
3: u = User.all
4:
5: binding.pry
6:
=> 7: render json: {users: u}
8: end
[1] pry(#<UsersController>)> User.all
User Load (0.3ms) SELECT `users`.* FROM `users`
↳ .pryrc:14
+----+------+-------------------------+-------------------------+
| id | name | created_at | updated_at |
+----+------+-------------------------+-------------------------+
| 1 | A | 2020-10-02 15:59:36 UTC | 2020-10-02 15:59:36 UTC |
| 2 | B | 2020-10-02 15:59:36 UTC | 2020-10-02 15:59:36 UTC |
| 3 | C | 2020-10-02 15:59:36 UTC | 2020-10-02 15:59:36 UTC |
+----+------+-------------------------+-------------------------+
3 rows in set

レコードの表示が、テーブル形式になりました。


今回は、(pry-rails,pry-byebug)を使用しての pry を使用してみました。
pry の利点を理解したというより、byebug が便利でしたというのが、今後 Rails 触っての理解かなと感じます。

ではでは。