228

我将 Pry 与我的 Rails 应用程序一起使用。我binding.pry在模型中设置了一个循环来尝试调试问题。例如:

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

当我输入quit时,它会进入下一次迭代并再次停止。有没有办法跳出循环,所以我不必输入quit100 次?

目前我知道如何摆脱它的唯一方法是使用CTRL+C并重新启动应用程序。

4

10 回答 10

447

要无条件退出 Pry,请键入

exit-program

从@Nick 的评论编辑:也有效:

!!!
于 2012-06-27T13:42:49.413 回答
120

我用:

disable-pry

这将保持程序运行,但会阻止它继续停止执行。当您在控制台中进行调试时,这尤其有用。

于 2014-02-12T17:39:07.610 回答
36

要退出所有内容,请使用:

exit!

这应该忽略所有正在进行的绑定。

于 2013-08-14T19:21:55.103 回答
25

三重感叹号 ( !!!) 可以做到这一点。

于 2014-11-17T23:01:20.937 回答
18

采用

disable-pry

要重新启用,请将其添加到您的控制器

ENV['DISABLE_PRY'] = nil
于 2014-07-24T23:12:18.897 回答
14

语句与 GDB 中的binding.pry断点完全相同。GDB 中的这样一个断点也会被命中 100 次。

如果您只想binding.pry命中一次,对于循环的第一次迭代,请使用类似的条件binding.pry

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

然后,您只需键入即可退出当前会话exit

于 2011-11-04T21:52:00.980 回答
2

使用 gem ,您可以使用(finish 命令)pry-moves跳出循环f


例子:

    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
于 2018-10-07T13:58:31.093 回答
2

按'q',你会看到像这样

[1] pry(#<AlbumsController>)>

类型

exit

如果没有,这一个词就可以了:

control + c
于 2019-05-29T07:01:33.287 回答
1

基于以上两个先前的答案:

谢谢你们!你的建议对我帮助很大!

我只是想分享一个简单的愚蠢技巧,我个人使用它来一直不用担心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
于 2018-06-15T07:57:52.913 回答
0

如果您只需要调试一次迭代,则可以只引发错误,转义保证:

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

或有条件:

(1..100).each do |i|
  if i == 50
    binding.pry 
    raise
  end
  puts i
end
于 2021-05-18T13:28:03.983 回答