So unterdrücken Sie die Rails-Konsolen- / IRB-Ausgänge

87

Ich habe ein ziemlich seltsames Problem.

Ich habe einige Datenbankeinträge in unserem Produktionsserver in der Rails Console getestet, bei denen fast alle Befehle zu einer großen Anzahl von O / P-Zeilen führten, aufgrund derer der SSH-Kanal hängen blieb :(

Gibt es eine Möglichkeit, die Konsolen- / IRB-Screenfuls zu unterdrücken?

Vielen Dank

ghtn
quelle

Antworten:

187

Sie können anhängen ; Null für alle Ihre Befehle / Anweisungen.

Beispiel:

users = User.all; nil

Tatsächlich gibt irb den (Rückgabe-) Wert der zuletzt ausgeführten Anweisung aus. In diesem Fall wird also nur nil gedruckt, da nil die zuletzt ausgeführte gültige Anweisung ist :)

Intellidiot
quelle
13
Genial, ein noch kürzerer Weg ist users = User.all; 0
Bob
1
Dies funktioniert nur für zurückgegebene Objekte, nicht für p und Puts.
the_minted
Es ist nur ein Hack, Sie können nur count verwenden, wie Users.all.countnur eine users = User.all; Users.all.count
Zeilenausgabe
31

Auf der Suche nach einer Lösung zum Stummschalten der IRB- / Konsolenausgabe fand ich auch eine Antwort auf austinruby.com :

Stille irb:

conf.return_format = ""

Standardausgabe:

conf.return_format = "=> %s\n"

Limit auf zB 512 Zeichen:

conf.return_format = "=> limited output\n %.512s\n"
LarsDK
quelle
Sehr hilfreich. Gibt es eine Möglichkeit, dies beim Öffnen der irb / Rails-Konsole festzulegen, dh als Parameter in?
Kache
Sie könnten versuchen, es in $ HOME / .irbrc
hdgarrood
8

Fügen Sie dies hier zu Ihrem ~ / .irbrc hinzu:

require 'ctx'
require 'awesome_print'

module IRB
  class Irb    
    ctx :ap do
      def output_value()
        ap(@context.last_value)
      end
    end
    ctx :puts do
      def output_value()
        puts(@context.last_value)
      end
    end
    ctx :p do
      def output_value()
        p(@context.last_value)
      end
    end
    ctx :quiet do
      def output_value()
      end
    end
  end
end

def irb_mode(mode)
  ctx(mode) { irb }
end

(Hinweis: Sie müssen den ctxEdelstein zuerst installieren , dies awesome_printist jedoch natürlich optional.)

Wenn Sie sich jetzt auf einer Konsole befinden, die irb verwendet, können Sie Folgendes tun:

Normaler Modus:

irb(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }

=> {:this=>"is a complex object", :that=>[{:will=>"probably"}, {:be=>"good to read"}], :in=>{:some=>{:formatted=>"way"}}}

... ja, genau das, was Sie erwarten.

awesome_print Modus:

irb(main):002:0> irb_mode(:ap)
irb#1(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }

=> {
    :this => "is a complex object",
    :that => [
        [0] {
            :will => "probably"
        },
        [1] {
            :be => "good to read"
        }
    ],
      :in => {
        :some => {
            :formatted => "way"
        }
    }
}

... wow, jetzt wird alles großartig ausgedruckt! :) :)

Ruhemodus:

irb#1(main):002:0> irb_mode(:quiet)
irb#1(main):001:0> { this:'is a complex object', that:[ { will:'probably'}, { be:'good to read' } ], in:{ some:{ formatted:'way'} } }
irb#1(main):002:0>

... whoah, überhaupt keine Ausgabe? Nett.

Wie auch immer, Sie können einen beliebigen Modus hinzufügen. Wenn Sie mit diesem Modus fertig sind, können exitSie ihn einfach wieder ausschalten.

Hoffe das war hilfreich! :) :)

Mason Cloud
quelle
4

Ausgabe im Allgemeinen unterdrücken

Schauen Sie sich je nach Ihren Anforderungen auch die Verwendung quietlyoder silence_streamUnterdrückung der Ausgabe im Allgemeinen an, nicht nur in der irb / console:

silence_stream(STDOUT) do
  users = User.all
end

HINWEIS: quietlywird in Ruby 2.2.0 nicht mehr unterstützt und schließlich entfernt. (Danke BenMorganIO !)

Weitere Informationen finden Sie hier .

Joshua Pinter
quelle
1
Beachten Sie, dass dies quietlyin Ruby 2.2.0 veraltet ist und entfernt wird.
BenMorganIO
@BenMorganIO Der Antwort wurde eine Notiz hinzugefügt. Dank dafür!
Joshua Pinter
4
irb --simple-prompt --noecho
  • --simple-prompt - Verwendet eine einfache Eingabeaufforderung - nur >>
  • --noecho - Unterdrückt das Ergebnis von Operationen
user3490179
quelle
3

Folgendes in irb auszuführen funktioniert für mich:

irb_context.echo = false
schpet
quelle