Ruby Pryでループから抜け出すにはどうすればよいですか?


212

RailsアプリケーションでPryを使用しています。binding.pry問題をデバッグするために、モデルのループ内に設定しました。例えば:

(1..100).each do |i|
  binding.pry
  puts i
end

と入力quitすると、次の反復に進み、再び停止します。ループから抜け出す方法はあるので、quit100回タイプする必要はありませんか?

現在、私がそれから抜け出す方法を知っている唯一の方法は、CTRL+ を使用しCてアプリケーションを再起動することです。

回答:


412

無条件にPryを終了するには、次のように入力します。

exit-program

@Nickのコメントからの編集:動作します:

!!!

@Evandroに感謝します。それがまさに私が探していたものです。
ライアン

バインドをすぐに実行することは明らかですが、just exitを使用すると、プログラムを実行し続けることができます。
AJP

1
これは私が走っているときはうまくいきませんでしたrspec。しかし、CTRL-Cを2回押しました。
エリックウォーカー

5
Mac OSXでは、Ctrl + C2回押すとPryセッションが強制終了されますが、そのターミナルウィンドウも事実上強制終了されます。後続の出力でグリッチが発生し、ターミナルタブを閉じて新しいタブに移動する必要があります。ただし、!!!この悪化の影響はありません。
Topher Hunt 2015

@Evandroあなたはこれが私をどのように救ったか分かりません!
Sri Harsha Kappala

111

私が使う:

disable-pry

これはプログラムの実行を維持しますが、実行を停止し続けることを防ぎます。これは、コンソールでデバッグするときに特に役立ちます。


11
(コマンドラインから)再度有効にするには:ENV ['DISABLE_PRY'] = nil
stebooks

2
disable-pryを使用した後、pryを再入力できませんでした。ENV [ 'DISABLE_PRY'] = nilを使用した後
daslicious

2
再度入力ENV['DISABLE_PRY'] = nilするには、コマンドラインやRailsコンソールではなく、コントローラーを設定するだけです。
Atul Khanduri

これは、ガードを使用していて、そのテスト実行のために実行を停止したい場合に使用するのに最適なものです。次のテスト実行時にリセットされます。
BBonifield 2015

31

すべてを終了するには、以下を使用します。

exit!

これにより、進行中のすべてのバインディングが無視されます。


4
これは同時にサーバーも強制終了します。exit-programサーバーを再起動したくない場合は、おそらくまだ最善の選択肢です。
ライアン

3
明確にexit-programするだけでrails serverセッションを維持できますが、スローされるようですSystemExit
Alan David Garcia

24

三重感嘆符(!!!)はそれを行います。


これはOSX 10.11.4(El Capitan)での私に対する解決策でした。私はdisable-pry+ ENV['DISABLE_PRY'] = nilコンボを試してexit-programいませんが、systemExitを与える試みをしました。これはうまくいきます。(オンレール 3.2.22.2、PRY 0.10.3およびルビー 1.9.3)
SidOfc

17

使用する

disable-pry

再利用可能にするには、これをコントローラーに追加します

ENV['DISABLE_PRY'] = nil

14

binding.pry声明は、GDBでブレークポイントとまったく同じです。GDBのこのようなブレークポイントも100回ヒットします。

binding.pry1回だけヒットする場合は、ループの最初の反復で、次のbinding.pryように条件を使用します。

(1..100).each do |i|
  binding.pry if i == 1
  puts i
end

次に、と入力するだけで現在のセッションを終了しますexit


1

上記の2つの以前の回答に基づく:

君たちありがとう!あなたのアドバイスは本当に私を助けてくれました!

私は、DISABLE_PRY常に環境変数を気にしないために個人的に使用する、単純な愚かなトリックを共有したいだけです。このコールバックをApplicationControllerプロジェクトのベースコントローラーに永続的に追加します。disable-pryが呼び出されるたびに、PRYが自動的に再度有効になります。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :reenable_pry

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end

1

gem pry-movesを使用すると、f(finishコマンド)を使用してループの外に出ることができます


例:

    42: def test
    43:   3.times do |i|
 => 44:     binding.pry
    45:     puts i
    46:   end
    47:   puts :finish
    48: end

[1] pry(main)> f
0
1
2

Frame: 0/1 method
From: playground/sand.rb:47 main

    42: def test
    43:   3.times do |i|
    44:     binding.pry
    45:     puts i
    46:   end
 => 47:   puts :finish
    48: end

0

「q」を押すと、このように表示されます

[1] pry(#<AlbumsController>)>

タイプ

exit

そうでない場合、この1つの単語で十分です。

control + c
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.