94 votes

Comment supprimer les sorties de la console/irb de Rails

Je testais certaines entrées de bases de données sur notre serveur de production dans la console Rails, où presque toutes les commandes produisaient un nombre considérable de lignes de sortie et provoquaient le blocage du canal ssh.

Y a-t-il un moyen de supprimer les écrans de la console/irb ?

197voto

intellidiot Points 4854

Vous pouvez ajouter ; nil à vos déclarations.

Exemple :

users = User.all; nil

irb imprime le valeur de retour de la dernière instruction exécutée ; ainsi, dans ce cas, il imprimera seulement nil depuis nil est la dernière instruction valide exécutée.

14 votes

Génial, un moyen encore plus court est le point-virgule suivi d'un objet comme users = User.all; 0

1 votes

Cela ne fonctionne que pour les objets retournés, pas pour les travaux de p et puts.

0 votes

C'est juste un hack, vous pouvez juste utiliser count, comme Users.all.count Si vous voulez enregistrer la sortie dans une variable, vous pouvez le faire comme suit users = User.all; Users.all.count

32voto

LarsDK Points 101

À la recherche d'une solution pour faire taire la sortie irb/console, j'ai également trouvé une réponse à l'adresse suivante austinruby.com :

silence irb :

conf.return_format = ""

sortie par défaut :

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

limite à 512 caractères par exemple :

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

0 votes

Très utile. Y a-t-il une chance qu'il y ait un moyen de définir ceci tout en ouvrant la console irb/rails, c'est-à-dire d'aliaser un paramètre ?

1 votes

Vous pouvez essayer de le mettre dans $HOME/.irbrc

8voto

Mason Cloud Points 465

Ici, ajoutez ceci à votre ~/.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

(Remarque : vous devez installer le ctx Le joyau d'abord, cependant awesome_print est facultatif, bien sûr).

Maintenant, lorsque vous êtes sur n'importe quelle console qui utilise irb, vous pouvez faire ce qui suit :

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

...ouais, exactement ce que vous attendez.

awesome_print mode :

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, maintenant tout s'imprime de manière impressionnante ! :)

Mode silencieux :

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, pas de sortie du tout ? Sympa.

Quoi qu'il en soit, vous pouvez ajouter le mode que vous voulez, et quand vous avez terminé avec ce mode, il suffit de exit et vous serez de retour dans le mode précédent.

J'espère que cela a été utile ! :)

4voto

Josh Pinter Points 3814

Suppression de la production, en général

En fonction de vos besoins, vous pouvez également envisager l'utilisation de l'option quietly o silence_stream pour supprimer la sortie en général, pas seulement dans l'irb/console :

silence_stream(STDOUT) do
  users = User.all
end

NOTE : silence_stream supprimé dans Rails 5+.

NOTE : quietly sera déprécié dans Ruby 2.2.0 et sera éventuellement supprimé. (Merci BenMorganIO !)

Vous trouverez de plus amples informations aquí .

Contournement pour Rails 5+.

Comme mentionné ci-dessus, silence_stream n'est plus disponible car il n'est pas thread safe. Il n'y a pas d'alternative thread safe. Mais si vous souhaitez toujours utiliser silence_stream et que vous savez qu'il n'est pas thread safe et que vous ne l'utilisez pas de manière multithread, vous pouvez le rajouter manuellement comme initialisateur.

_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 votes

Notez que quietly est déprécié dans ruby 2.2.0 et va être supprimé.

0 votes

@BenMorganIO J'ai ajouté une note à la réponse. Merci pour cela !

4voto

user3490179 Points 1
irb --simple-prompt --noecho
  • --simple-prompt - Utilise une simple invite - juste >>
  • --noecho - Supprime le résultat des opérations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X