Come sopprimere gli output della console / irb di Rails


89

Sono bloccato con un problema piuttosto strano.

Stavo testando alcune voci db nel nostro server di produzione in Rails Console dove quasi tutti i comandi risultavano un numero enorme di linee o / p, a causa delle quali il canale ssh veniva impiccato :(

C'è un modo per sopprimere le schermate di console / irb?

Grazie

Risposte:


192

Puoi aggiungere ; nulla a tutti i tuoi comandi / istruzioni.

Esempio:

users = User.all; nil

In realtà irb stampa il valore (return) dell'ultima istruzione eseguita. Quindi in questo caso verrà stampato solo nil poiché nil è l'ultima istruzione valida eseguita :)


13
Fantastico, un modo ancora più breve è il punto e virgola seguito da un oggetto comeusers = User.all; 0
Bob

1
Funziona solo per gli oggetti restituiti, non per p e put.
il_ coniato il

è solo un trucco, puoi semplicemente usare count, come Users.all.count, solo una riga di output, e se vuoi memorizzare l'output in una variabile può essere fatto in questo modousers = User.all; Users.all.count
Tasawar Hussain

31

Alla ricerca di una soluzione su come silenziare l'output di irb / console, ho anche trovato una risposta su austinruby.com :

silenzio irb:

conf.return_format = ""

output predefinito:

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

limite ad es. 512 caratteri:

conf.return_format = "=> limited output\n %.512s\n"

Molto utile. C'è qualche possibilità che ci sia un modo per impostarlo mentre si apre la console irb / rails, cioè alias un parametro in?
Kache

Potresti provare a metterlo in $ HOME / .irbrc
hdgarrood

8

Qui, aggiungi questo al tuo ~ / .irbrc:

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

(Nota: devi prima installare la ctxgemma, anche se awesome_printè facoltativa, ovviamente.)

Ora, quando sei su qualsiasi console che utilizza irb, puoi fare quanto segue:

Modalità normale:

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"}}}

... sì, proprio quello che ti aspetti.

awesome_print modalità:

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, ora tutto sta stampando alla grande! :)

Modalità silenziosa:

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, nessuna uscita? Bello.

Ad ogni modo, puoi aggiungere la modalità che preferisci e quando hai finito con quella modalità, basta exito quella e tornerai nella modalità precedente.

Spero sia stato utile! :)


4

eseguire quanto segue all'interno di irb funziona per me:

irb_context.echo = false

4
irb --simple-prompt --noecho
  • --simple-prompt - Utilizza un semplice prompt - solo >>
  • --noecho - Sopprime il risultato delle operazioni

4

Sopprimi output, in generale

Inoltre, a seconda delle tue esigenze, dai un'occhiata all'uso quietlyo silence_streamalla soppressione dell'output in generale, non solo in irb / console:

silence_stream(STDOUT) do
  users = User.all
end

NOTA: silence_streamrimosso in Rails 5+.

NOTA: quietlysarà deprecato in Ruby 2.2.0 e alla fine verrà rimosso. (Grazie BenMorganIO !)

Ulteriori informazioni possono essere trovate qui .

Work Around for Rails 5+.

Come accennato in precedenza, silence_streamnon è più disponibile perché non è thread-safe. Non esiste un'alternativa thread-safe. Ma se vuoi ancora usarlo silence_streame sei consapevole che non è thread-safe e non lo stai usando in modo multithread, puoi aggiungerlo manualmente come inizializzatore.

config/initializer/silence_stream.rb

# Re-implementation of `silence_stream` that was removed in Rails 5 due to it not being threadsafe.
# This is not threadsafe either so only use it in single threaded operations.
# See https://api.rubyonrails.org/v4.2.5/classes/Kernel.html#method-i-silence_stream.
#
def silence_stream( stream )
  old_stream = stream.dup
  stream.reopen( File::NULL )
  stream.sync = true
  yield

ensure
  stream.reopen( old_stream )
  old_stream.close
end

1
Nota che quietlyè deprecato in ruby ​​2.2.0 e verrà rimosso.
BenMorganIO

@BenMorganIO ha aggiunto una nota alla risposta. Grazie per quello!
Joshua Pinter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.