Wie trete ich mit Ruby Pry aus einer Schleife heraus?


212

Ich verwende Pry mit meiner Rails-Anwendung. Ich habe binding.pryin meinem Modell eine Schleife eingerichtet, um ein Problem zu beheben. Beispielsweise:

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

Wenn ich tippe quit, geht es zur nächsten Iteration und stoppt erneut. Gibt es eine Möglichkeit, aus der Schleife auszusteigen, damit ich nicht quit100 Mal tippen muss ?

Derzeit weiß ich nur, wie ich daraus herauskomme, indem ich CTRL+ verwende Cund die Anwendung neu starte.

Antworten:


412

Geben Sie Folgendes ein, um Pry bedingungslos zu beenden

exit-program

Bearbeiten aus @ Nicks Kommentar : Funktioniert auch:

!!!

Danke @Evandro, genau das habe ich gesucht!
Ryan

Obwohl Sie offensichtlich sofort auf die Bindung exittreffen, kann das Programm mit just weiter ausgeführt werden.
AJP

1
Dies hat bei mir beim Laufen nicht funktioniert rspec. Aber STRG-C hat es zweimal getan.
Eric Walker

5
Unter Mac Ctrl + COS X wird durch zweimaliges Drücken die Pry-Sitzung beendet, aber auch das Terminalfenster wird effektiv beendet: Die nachfolgende Ausgabe ist fehlerhaft, sodass ich diese Terminal-Registerkarte schließen und zu einer neuen wechseln muss. Hat !!!diese erschwerende Wirkung jedoch nicht.
Topher Hunt

@Evandro Du hast keine Ahnung, wie mich das gerettet hat!
Sri Harsha Kappala

111

Ich benutze:

disable-pry

Dadurch wird das Programm weiterhin ausgeführt, die Ausführung wird jedoch nicht weiter gestoppt. Dies ist besonders hilfreich, wenn Sie in der Konsole debuggen.


11
So aktivieren Sie (über die Befehlszeile) erneut: ENV ['DISABLE_PRY'] = nil
stebooks

2
Ich konnte Pry nach der Verwendung von Disable-Pry nicht erneut eingeben. Auch nach Verwendung von ENV ['DISABLE_PRY'] = nil
daslicious

2
Um pry erneut einzugeben, müssen Sie lediglich ENV['DISABLE_PRY'] = nilin Ihrem Controller nicht in der Befehlszeile ODER in der Rails-Konsole festlegen .
Atul Khanduri

Dies ist die perfekte Option, wenn Sie Guard verwenden und nur möchten, dass es für diesen Testlauf nicht mehr ausgeführt wird. Es wird beim nächsten Testlauf zurückgesetzt.
BBonifield

31

Um alles zu beenden, verwenden Sie:

exit!

Dies sollte alle fortlaufenden Bindungen ignorieren.


4
Dies tötet gleichzeitig auch den Server. exit-programist wahrscheinlich immer noch die beste Option, wenn Sie den Server nicht neu starten möchten.
Ryan

3
Nur zur Verdeutlichung exit-programkönnen Sie Ihre rails serverSitzung beibehalten , scheinen aber einenSystemExit
Alan David Garcia

24

Dreifacher Ausruf ( !!!) würde das tun.


Dies war die Lösung für mich unter OSX 10.11.4 (El Capitan). Ich habe die disable-pry+ ENV['DISABLE_PRY'] = nil-Kombination nicht ausprobiert, aber ich habe versucht, exit-programwas mir einen systemExit gab. Dieser funktioniert einfach. (Auf Schienen 3.2.22.2, hebel 0.10.3 und Rubin 1.9.3)
SidOfc

17

Verwenden

disable-pry

Fügen Sie dies zum Rendern Ihrem Controller hinzu

ENV['DISABLE_PRY'] = nil

14

Eine binding.pryAnweisung entspricht genau einem Haltepunkt in GDB. Ein solcher Haltepunkt in GDB würde auch 100 Mal erreicht werden.

Wenn Sie möchten binding.pry, dass die Schleife für die erste Iteration der Schleife nur einmal getroffen wird, verwenden Sie eine Bedingung binding.prywie folgt:

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

Anschließend beenden Sie die aktuelle Sitzung, indem Sie einfach eingeben exit.


1

Basierend auf den beiden vorherigen Antworten:

Danke Jungs! Ihre Ratschläge haben mir sehr geholfen!

Ich möchte nur einen einfachen dummen Trick teilen, den ich persönlich benutze, um mir nicht die DISABLE_PRYganze Zeit über die Umgebungsvariable Sorgen zu machen . Fügen Sie diesen Rückruf ApplicationControllerdauerhaft zum Basis-Controller Ihres Projekts hinzu. PRY wird bei jedem Aufruf automatisch wieder aktiviert disable-pry:

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

  private

  def reenable_pry
    ENV['DISABLE_PRY'] = nil
  end
end

1

Mit gem können pry-movesSie mit f(finish command) aus der Schleife treten


Beispiel:

    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

0

Drücken Sie 'q' und Sie werden genau so sehen

[1] pry(#<AlbumsController>)>

Art

exit

Dieses eine Wort reicht aus, wenn nicht:

control + c
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.