Ryan
Ryan

Reputation: 9430

How do I step out of a loop with Ruby Pry?

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

Answers (10)

Maxime Boué
Maxime Boué

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

Heartless Vayne
Heartless Vayne

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

Evandro
Evandro

Reputation: 4918

To exit Pry unconditionally, type

exit-program

Edit from @Nick's comment: Also works:

!!!

Upvotes: 487

Daniel Garmoshka
Daniel Garmoshka

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

zinovyev
zinovyev

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

horseyguy
horseyguy

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

Blake
Blake

Reputation: 2397

To exit everything, use:

exit!

This should ignore all proceeding bindings.

Upvotes: 43

Chet3x16
Chet3x16

Reputation: 341

Use

disable-pry

To renable, add this to your controller

ENV['DISABLE_PRY'] = nil

Upvotes: 20

Hahn
Hahn

Reputation: 351

Triple exclamation (!!!) would do that.

Upvotes: 25

stebooks
stebooks

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

Related Questions