Comment sortir d'une boucle avec Ruby Pry?

212

J'utilise Pry avec mon application Rails. J'ai mis à l' binding.pryintérieur d'une boucle dans mon modèle pour essayer de déboguer un problème. Par exemple:

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

Lorsque je tape quit, il passe à l'itération suivante et s'arrête à nouveau. Existe-t-il un moyen de sortir de la boucle pour ne pas avoir à taper quit100 fois?

Actuellement, la seule façon de m'en sortir est d'utiliser CTRL+ Cet de redémarrer l'application.

Ryan
la source

Réponses:

413

Pour quitter Pry sans condition, tapez

exit-program

Modifier à partir du commentaire de @ Nick : Fonctionne également:

!!!
Evandro
la source
Merci @Evandro, c'est exactement ce que je cherchais!
Ryan
Bien que vous frappiez évidemment la liaison immédiatement, l'utilisation de simplement exitpermettra au programme de continuer à fonctionner.
AJP
1
Cela n'a pas fonctionné pour moi lors de la course rspec. Mais CTRL-C, deux fois, l'a fait.
Eric Walker
5
sur Mac OSX, appuyer Ctrl + Cdeux fois pour tuer la session Pry, mais aussi pour tuer cette fenêtre de terminal: la sortie suivante est défectueuse de sorte que je dois fermer cet onglet de terminal et passer à un nouveau. N'a !!!cependant pas cet effet aggravant.
Topher Hunt du
@Evandro Vous ne savez pas comment cela m'a sauvé!
Sri Harsha Kappala
111

J'utilise:

disable-pry

Cela maintiendra le programme en cours d'exécution, mais l'empêchera de continuer à arrêter l'exécution. Cela est particulièrement utile lorsque vous déboguez dans la console.

stebooks
la source
11
Pour réactiver (à partir de la ligne de commande): ENV ['DISABLE_PRY'] = nil
stebooks
2
je n'ai pas pu rentrer pry après avoir utilisé disable-pry. Même après avoir utilisé ENV ['DISABLE_PRY'] = nil
daslicious
2
Pour entrer à nouveau dans Pry, tout ce que vous avez à faire est de configurer ENV['DISABLE_PRY'] = nilvotre contrôleur et non pas en ligne de commande OU sur la console des rails.
Atul Khanduri
C'est le parfait à utiliser lorsque vous utilisez guard et que vous voulez juste qu'il arrête de faire levier pour ce test. Il se réinitialisera lors du prochain test.
BBonifield
31

Pour tout quitter, utilisez:

exit!

Cela doit ignorer toutes les liaisons en cours.

Blake
la source
4
Cela tue également le serveur en même temps. exit-programest probablement la meilleure option si vous ne souhaitez pas redémarrer le serveur.
Ryan
3
Juste pour clarifier exit-programvous permet de maintenir votre rails serversession mais semble jeter unSystemExit
Alan David Garcia
24

Une triple exclamation ( !!!) ferait cela.

Hahn
la source
C'était la solution pour moi sur OSX 10.11.4 (El Capitan), je n'ai pas essayé le combo disable-pry+ ENV['DISABLE_PRY'] = nilmais j'ai essayé exit-programce qui m'a donné une sortie système. Celui-ci fonctionne juste. (Sur rails 3.2.22.2, levier 0.10.3 et rubis 1.9.3)
SidOfc
17

Utilisation

disable-pry

Pour renable, ajoutez ceci à votre contrôleur

ENV['DISABLE_PRY'] = nil
Chet3x16
la source
14

Une binding.pryinstruction est exactement la même chose qu'un point d'arrêt dans GDB. Un tel point d'arrêt dans GDB serait également atteint 100 fois.

Si vous ne voulez que la binding.pryfrappe une seule fois, pour la première itération de la boucle, utilisez un conditionnel binding.prysimilaire:

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

Vous quittez ensuite la session en cours en tapant simplement exit.

horseyguy
la source
1

Sur la base des deux réponses précédentes ci-dessus:

Merci les gars! Vos conseils m'ont vraiment beaucoup aidé!

Je veux juste partager une astuce stupide, que j'utilise personnellement pour ne pas me soucier de la DISABLE_PRYvariable d'environnement tout le temps. Ajoutez ce rappel au contrôleur ApplicationControllerde base de votre projet en permanence. Il réactiverait automatiquement PRY à chaque disable-pryappel de:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :reenable_pry

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end
zinovyev
la source
1

En utilisant gem, pry-movesvous pouvez sortir de la boucle en utilisant f(commande finish)


exemple:

    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
Daniel Garmoshka
la source
0

appuyez sur «q» et vous verrez comme ça

[1] pry(#<AlbumsController>)>

type

exit

ce seul mot fera, sinon:

control + c
Vayne sans cœur
la source