问题
I'm using Pry with my Rails application. I set binding.pry
inside a loop in my model to try and debug a problem. For example:
(1..100).each do |i|
binding.pry
puts i
end
When I type quit
, it goes to the next iteration and stops again. Is there a way to step out of the loop so I don't have to type quit
100 times?
Currently the only way I know how to get out of it is to use CTRL+C and restart the application.
回答1:
To exit Pry unconditionally, type
exit-program
Edit from @Nick's comment: Also works:
!!!
回答2:
I use:
disable-pry
This will keep the program running, but will keep it from continuing to stop execution. This is especially helpful when you are debugging in the console.
回答3:
To exit everything, use:
exit!
This should ignore all proceeding bindings.
回答4:
Triple exclamation (!!!
) would do that.
回答5:
Use
disable-pry
To renable, add this to your controller
ENV['DISABLE_PRY'] = nil
回答6:
A binding.pry
statement is exactly the same as a breakpoint in GDB. Such a breakpoint in GDB would be hit 100 times too.
If you only want the binding.pry
to be hit once, for the first iteration of the loop, then use a conditional on the binding.pry
like so:
(1..100).each do |i|
binding.pry if i == 1
puts i
end
You then exit the current session by just typing exit
.
回答7:
Based on the two previous answers above:
- https://stackoverflow.com/a/21735420/3137698
- https://stackoverflow.com/a/24945487/3137698
Thank you guys! Your advices have helped me really a lot!
I just want to share a simple stupid trick, that I personally use to don't worry about the DISABLE_PRY
environment variable all the time. Add this callback to the base controller ApplicationController
of your project permanently. It would automatically re-enable PRY every time the disable-pry
is called:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :reenable_pry
private
def reenable_pry
ENV['DISABLE_PRY'] = nil
end
end
回答8:
Using gem pry-moves
you can step out of loop using f
(finish command)
example:
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
回答9:
press 'q' and you will see just like this
[1] pry(#<AlbumsController>)>
type
exit
this one word will do, if not:
control + c
来源:https://stackoverflow.com/questions/8015531/how-do-i-step-out-of-a-loop-with-ruby-pry