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.
To exit Pry unconditionally, type
exit-program
Edit from @Nick's comment : Also works:
!!!
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.
To exit everything, use:
exit!
This should ignore all proceeding bindings.
三重感叹号 ( !!!
) 会做到这一点。
Use
disable-pry
To renable, add this to your controller
ENV['DISABLE_PRY'] = nil
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
.
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
press 'q' and you will see just like this
[1] pry(#<AlbumsController>)>
type
exit
this one word will do, if not:
control + c
Based on the two previous answers above:
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
If you just need to debug one iteration, you can just raise error, escape guarantee :
(1..100).each do |i|
binding.pry
raise
puts i
end
Or with condition :
(1..100).each do |i|
if i == 50
binding.pry
raise
end
puts i
end
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.