zenet_logo

-株式会社ゼネット技術ブログ-

愛しのbidning.pry

初投稿になります。システム事業部の冨澤です。

ゼネットに入社後、Railsの開発に携わり1年間ほど経とうとしています。

f:id:zenet-tech:20210317101112p:plain

開発の中で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 ソースコードの編集モードに切り替え

 

  • cdlsを組み合わせることでソース内を移動し定義されている変数やメソッドを確認することができます。

例) 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は普段から利用しているので使い慣れている、と思っている節がありましたがまだまだだと痛感しました。
理解している、と思っていることでも改めて調べてみる癖をつけていきたいと思います。
知らなかったコマンドの中では特にlscdeditなどは使いこなせるとソースコードを縦横無尽に移動や編集ができそうなので 試していきたいです。
今回の記事ではまだまだ乗せられていないコマンドがたくさんあるので、ご興味のある方はぜひ調べてみてください。

zenet-web.co.jp