Cómo suprimir las salidas de consola / irb de Rails

89

Estoy atrapado con un problema bastante extraño.

Estaba probando algunas entradas de db en nuestro servidor de producción en Rails Console donde casi todos los comandos daban como resultado una gran cantidad de líneas o / p, por lo que el canal ssh se colgaba :(

¿Hay alguna forma de suprimir las pantallas de consola / irb?

Gracias

ghtn
fuente

Respuestas:

191

Puede agregar ; nulo para todos sus comandos / declaraciones.

Ejemplo:

users = User.all; nil

En realidad, irb imprime el valor (de retorno) de la última sentencia ejecutada. Por lo tanto, en este caso, imprimirá solo nil, ya que nil es la última declaración válida ejecutada :)

intellidiot
fuente
13
Impresionante, una forma aún más corta es el punto y coma seguido de un objeto comousers = User.all; 0
Bob
1
Esto solo funciona para objetos devueltos, no trabajo de py put.
the_minted
es solo un truco, puede usar el recuento, como Users.all.count, solo una salida de línea, y si desea almacenar la salida en una variable, puede hacerlo asíusers = User.all; Users.all.count
Tasawar Hussain
31

En busca de una solución sobre cómo silenciar la salida de irb / console, también encontré una respuesta en austinruby.com :

silencio irb:

conf.return_format = ""

salida predeterminada:

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

límite a, por ejemplo, 512 caracteres:

conf.return_format = "=> limited output\n %.512s\n"
LarsDK
fuente
Muy útil. ¿Alguna posibilidad de que haya una manera de configurar esto al abrir la consola irb / rails, es decir, alias un parámetro en?
Kache
Podría intentar ponerlo en $ HOME / .irbrc
hdgarrood
8

Aquí, agregue esto a su ~ / .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: ctxprimero debe instalar la gema, aunque awesome_printes opcional, por supuesto).

Ahora, cuando esté en cualquier consola que use irb, puede hacer lo siguiente:

Modo normal:

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í, justo lo que esperabas.

awesome_print modo:

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

... ¡guau, ahora todo se está imprimiendo increíblemente! :)

Modo silencioso:

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, no hay salida en absoluto? Agradable.

De todos modos, puede agregar el modo que desee, y cuando haya terminado con ese modo, simplemente exit elimínelo y volverá al modo anterior.

¡Espero que haya sido útil! :)

Mason Cloud
fuente
4

ejecutar lo siguiente dentro de irb funciona para mí:

irb_context.echo = false
schpet
fuente
4
irb --simple-prompt --noecho
  • --simple-prompt - Utiliza un mensaje simple, solo >>
  • --noecho - Suprime el resultado de operaciones
usuario3490179
fuente
4

Supresión de salida, en general

Además, dependiendo de sus necesidades, eche un vistazo a usar quietlyo silence_streampara suprimir la salida en general, no solo en irb / console:

silence_stream(STDOUT) do
  users = User.all
end

NOTA: silence_streameliminado en Rails 5+.

NOTA: quietlyquedará obsoleto en Ruby 2.2.0 y eventualmente se eliminará. (¡Gracias BenMorganIO !)

Puede encontrar más información aquí .

Trabajar alrededor para rieles 5+.

Como se mencionó anteriormente, silence_streamya no está disponible porque no es seguro para subprocesos. No existe una alternativa segura para subprocesos. Pero si aún desea usarlo silence_streamy sabe que no es seguro para subprocesos y no lo está usando de manera multiproceso, puede volver a agregarlo manualmente como inicializador.

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
Joshua Pinter
fuente
1
Tenga en cuenta que quietlyestá obsoleto en ruby ​​2.2.0 y se eliminará.
BenMorganIO
@BenMorganIO Agregó una nota a la respuesta. ¡Gracias por eso!
Joshua Pinter