背景
binding.pryはRailsアプリケーションのコード中にブレイクポイントを仕掛けてデバッグ出来る優れものなんですが、困ったことにループ処理の中にブレイクポイントを仕掛けちゃうと、あれやこれやコマンド叩いても抜けられなくて、毎回Ctrl+CでWEBサーバごと終了なんてことしてた。
そのたびにまた rails s でサーバ起動させたりでめんどい。どうやったら解決できるかちょっと探ってみた。pryのhelpコマンドで表示されるコマンドをいくつか試してみたのでログっておきます。
helpで調べたコマンドをいくつか叩いてみる
こんなコードで試してます。
ラーメン屋テーブルを検索してeachで処理する中にブレイクポイント(binding.pry)を仕掛けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def index @ramen_restaurants = RamenRestaurant.all @ramen_restaurants.each do |ramen_restaurant| begin name = ramen_restaurant.name binding.pry puts "test1" puts "test2" rescue => e puts e end end end |
helpを参照出来ます。
1 |
[1] pry(#<RamenRestaurantsController>)> help |
ls
pryのコマンドですね。オブジェクトのメソッドや変数を確認できる。nameはString型なのでString型のメソッドなどが列挙されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
> ls name Comparable#methods: < <= > >= between? JSON::Ext::Generator::GeneratorMethods::String#methods: to_json_raw to_json_raw_object V8::Conversion::String#methods: to_v8 String#methods: % at chomp deconstantize encode! gsub inspect oct rstrip! split succ! to_i unpack * b chomp! delete encode_json gsub! intern ord safe_constantize squeeze sum to_json upcase + blank? chop delete! encoding hash is_utf8? parameterize scan squeeze! swapcase to_r upcase! << bytes chop! demodulize end_with? hex last partition scrub squish swapcase! to_s upto <=> bytesize chr downcase ends_with? html_safe length pluralize scrub! squish! tableize to_str valid_encoding? == byteslice classify downcase! eql? humanize lines prepend setbyte start_with? titlecase to_sym === camelcase clear dump exclude? in_time_zone ljust replace shell_split starts_with? titleize to_time =~ camelize codepoints each_byte first include? lstrip reverse shellescape strip to tr [] capitalize concat each_char force_encoding indent lstrip! reverse! shellsplit strip! to_c tr! []= capitalize! constantize each_codepoint foreign_key indent! match rindex singularize strip_heredoc to_d tr_s acts_like_string? casecmp count each_line freeze index mb_chars rjust size sub to_date tr_s! as_json center crypt empty? from inquiry next rpartition slice sub! to_datetime truncate ascii_only? chars dasherize encode getbyte insert next! rstrip slice! succ to_f underscore |
raise-up
例外を発生させます。例外処理の実装するときとかに使えそう。
1 2 |
[2] pry(#<RamenRestaurantsController>)> raise-up RuntimeError |
whereami
これ知らなかったんだけど結構必要だと思う。lsとかコマンド叩くと、画面が情報で埋まってしまって、いまどこにいるかわからなくなってしまいます。そこで再びブレイクしている付近のコードを表示することが出来るというもの。
hist
pryで叩いたコマンドの履歴を確認出来ます。使うかな?わからん。
show-source
引数なしで叩くと、今ブレイクしているメソッドのソースが表示された。
[5] pry(#
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 |
From: /Users/haradaatsushi/source/mencolle_server/app/controllers/ramen_restaurants_controller.rb @ line 4: Owner: RamenRestaurantsController Visibility: public Number of lines: 13 def index @ramen_restaurants = RamenRestaurant.all @ramen_restaurants.each do |ramen_restaurant| begin name = ramen_restaurant.name binding.pry puts "test1" puts "test2" rescue => e puts e end end end > show-source RamenRestaurantsController # クラス名を指定すると全ソースが見える > show-source RamenRestaurant Error: Couldn't locate a definition for RamenRestaurant! # モデルクラス名を指定したらダメだった。指定の仕方が違うのかな? |
!!!
exit-programコマンドのエイリアス。今回見つけたかったコマンド。ブレイクを終了させます。例外で終了するみたい。本当は例外じゃなくて以降全てをコンティニューする感じで終了するのが欲しかったのだけれど。
1 |
SystemExit in RamenRestaurantsController#index |
!!@
exit-allのエイリアス。全部終了?ループ内で叩いても終了せずまたブレイクしてしまった。exitコマンドと何が違うんだろう。
n
nextのエイリアス。
これは頻繁に使いますね。多分一番使うんじゃないですかね。次の行へ進む。
s
stepのエイリアス。
ブレイクしている行で実行しているメソッドなどにステップインする。これも比較的よく使いますね。
disable-pry
これでループからも抜けてしかも例外になることなく処理を継続することが出来た。が、以降はブレイクポイントで止まらなくなる。pry-debugそのものがdisableになったみたい。サーバ再起動すれば元に戻ります。おしいな。これじゃない。
一番探しているのに近かったのは!!!ということでファイナルアンサー。

原田 敦

最新記事 by 原田 敦 (全て見る)
- Rails Engineでブログ機能追加するgemを作る - 2015年3月15日
- WEBエンジニア一人だけでサービスを作りきる方法-夫婦のための自動ごはん予定お知らせサービス「GoHaaan」制作でやったこと - 2015年3月7日
- CentOS6でMariaDBのDynamic Columnsを試してみた - 2015年2月28日