Reputation: 9430
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.
Upvotes: 244
Views: 91566
Reputation: 686
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
Upvotes: 0
Reputation: 992
press 'q' and you will see just like this
[1] pry(#<AlbumsController>)>
type
exit
this one word will do, if not:
control + c
Upvotes: 4
Reputation: 4918
To exit Pry unconditionally, type
exit-program
Edit from @Nick's comment: Also works:
!!!
Upvotes: 487
Reputation: 6352
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
Upvotes: 2
Reputation: 2163
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
Upvotes: 2
Reputation: 29895
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
.
Upvotes: 14
Reputation: 2397
To exit everything, use:
exit!
This should ignore all proceeding bindings.
Upvotes: 43
Reputation: 341
Use
disable-pry
To renable, add this to your controller
ENV['DISABLE_PRY'] = nil
Upvotes: 20
Reputation: 2337
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.
Upvotes: 126