初投稿になります。システム事業部の冨澤です。
ゼネットに入社後、Railsの開発に携わり1年間ほど経とうとしています。
開発の中でRails初心者の私を、日々助けてくれているpry。
そんなpryについて改めて初心に戻り、導入手順やそれぞれのgemのコマンド確認、 さらには調べてみて知った便利そうなコマンドをご紹介したいと思います。
pryとは
pryは「プライ」と読みます。
rubyにおけるデバッグツールで、 標準で使用できるirb
よりも強力なデバッグツールになります。
pryはruby全般において使用できるgemのpry
をはじめ、
rails console
にてpryが使用できるようになるgemのpry-rails
、
rails上でステップバイステップ実行が可能となるgemのpry-byebug
等があります。
Railsにおけるpryの設定
Gemfileにpry-railsを追加し bundle install
を実行します。
railsの場合、Gemfile内のgroup :development, :test do
内部に追加します。
group :development, :test do gem 'pry-rails' end
このgemを追加することで rails c
(bundle exec rails console)コマンドでpryを使用できるようになります。
また、binding.pry
でデバッグが可能となります。
コード中でデバッグしたい箇所にbinding.pry
を記述します。
そうすることでブレイクポイントとなり、railsの処理を止めることができるようになります。
そして確認したい変数名などを入力することでその中身を確認することができます。
例えば以下の行でブレイクしている場合
24: def admin? 25: binding.pry => 26: true if self.role == 'administrator' 27: end
self.role
と入力し実行することでその中身を表示することができます。
また、以下のコマンドが使用可能となります(一部抜粋)。
コマンド | 機能 |
---|---|
help | ヘルプ一覧表示 |
show-routes | routesの一覧表示(rails routesと同等) |
show-routes --grep [pattern] | routesの中から[pattern]をgrepして表示 |
show-models | modelのカラム一覧表示(*1) |
show-models --grep [pattern] | modelの中から[pattern]をgrepして表示 |
@ | 現在の止まっている行を表示(*2) |
!!! | プログラムを終了する |
reload! | ソースの再読み込みをする |
hist | 入力履歴を表示 |
(*1)以下のような形で出力されます。
User id: integer family_name: string first_name: string tel: string role: string create_at: datetime ...
(*2) 一見意味のないコマンドに見えますが、変数の表示などをしログが大量に表示されていた場合で、 処理を停止した部分のコードを表示したい場合に重宝します。
デバッグをもっと便利に
binding.pryで処理を止めている際に、次の行へ移動したりメソッド内部に移動するために pry-byebugをgemに追加します。
こちらもgroup :development, :test do
内部に追加します。
group :development, :test do gem 'pry-rails' gem 'pry-byebug' #これを追加 end
このgemを追加することで以下のコマンドが使用できるようになります。
コマンド | 機能 |
---|---|
next | 次の行へ(ステップオーバー) |
step | 次の行もしくはメソッド内部へ(ステップイン) |
finish | 現在実行中のメソッドから抜ける(ステップアウト) |
continue | 次のブレークポイントへ |
break [num] | 指定した[num]行にブレークポイントを設定 |
break [app/models/user.rb:15] | [user.rb]の15行目にブレークポイントを設定 |
break | 設定したブレークポイントを一覧表示 |
break [num] | 指定した[num]行にブレークポイントを設定 |
break --delete [num] | 指定した[num]にのブレークポイントを削除 |
break --disable-all | 設定したブレークポイントを全て無効化 |
next, step はオプションで数値を指定することができます。
その場合、指定した数値分、次の行やメソッド内部へ移動します。
例として,以下の26行目で現在ブレークしている場合、
24: def authenticated?(attribute, token) 25: binding.pry => 26: digest = send("#{attribute}_digest") 27: return false if digest.nil? 28: BCrypt::Password.new(digest).is_password?(token) 29: end
next 2
を実行することで28行目まで処理し移動することができます。
24: def authenticated?(attribute, token) 25: binding.pry 26: digest = send("#{attribute}_digest") 27: return false if digest.nil? => 28: BCrypt::Password.new(digest).is_password?(token) 29: end
breakコマンドは指定した行にブレークポイントを設定できます。
上記のコードで、26行目で止まっている場合、
break 28
を実行し、continue
することで28行目で再度止まることができます。
知っておくとより便利になるコマンド
すでに記載したコマンドに加えて、使いこなせると便利なコマンドをご紹介します。
コマンド | 機能 |
---|---|
cd [object] | 指定した[object]に移動する |
ls | 現在のスコープの変数とメソッドの一覧表示 |
ls -m | メソッドの一覧表示 |
ls -M | インスタンスメソッドの一覧表示 |
.[shell command] | シェルのコマンドを使用 |
edit | ソースコードの編集モードに切り替え |
cd
とls
を組み合わせることでソース内を移動し定義されている変数やメソッドを確認することができます。
例) ActiveRecord::Querying内に移動しメソッドの表示
railsコンソールを立ち上げ、cd ActiveRecord::Querying
と入力します
pry (main) > cd ActiveRecord::Querying
すると、ActiveRecord::Queryingクラスの内部へ移動します。
pry (ActiveRecord::Querying) >
ここでls -M
と入力することでActiveRecord::Queryingに定義されているインスタンスメソッドを一覧表示することができます。
pry(ActiveRecord::Querying):1 > ls -M ActiveRecord::Querying#methods: annotate create_with exists? find_by_sql first_or_create group left_joins none pick second third any? delete_all extending find_each first_or_create! having left_outer_joins none? pluck ...(省略)... rewhere take! where
- .[shell command]ドットをつけることでpry上でシェルコマンドを実行できます。
例:pry上でローカルのipアドレスを調べる
.ifconfig | grep 192.168 => inet 192.168.0.102 netmask 0xffffff00 broadcast 192.168.0.255
- editで編集モードに切り替える
pry上でソースコードの編集ができるようになります。
デフォルトのエディターは環境のnano
となっているので、
変更したい場合は.pryrc
に以下を記述します(例としてvimを設定)。
Pry.editor = 'vim'
例としてControllerをeditで開いてみます。
railsコンソールを立ち上げ、edit 任意のコントローラー名
を入力します。
今回はUsersControllerがあると仮定します。
pry (main) > edit UsersController
そうするとUsersControllerが編集モードで表示され編集可能な状態になります。
1 class BookingsController < ApplicationController 2 before_action :set_user, only: [:show, :edit, :update, :destroy] 3 before_action : authenticate_ip_address 4 5 def index 6 @users = User.all
railsサーバーを立ち上げてbinding.pryで止めている場合でも使用できるため、
使いようによっては作業効率が上がりそうですね。
まだまだ知らないことがたくさん
改めて調べてみると新しい発見があったり、知らないことが多くあることがわかりました。pryは普段から利用しているので使い慣れている、と思っている節がありましたがまだまだだと痛感しました。
理解している、と思っていることでも改めて調べてみる癖をつけていきたいと思います。
知らなかったコマンドの中では特にls
、cd
、edit
などは使いこなせるとソースコードを縦横無尽に移動や編集ができそうなので 試していきたいです。
今回の記事ではまだまだ乗せられていないコマンドがたくさんあるので、ご興味のある方はぜひ調べてみてください。