How to suppress Rails console/irb outputs

后端 未结 6 956
一生所求
一生所求 2020-12-07 14:01

I\'m stuck with a pretty weird problem.

I was testing some db entries in our production server in Rails Console where almost all the commands were resulting a huge n

相关标签:
6条回答
  • 2020-12-07 14:32

    Supress Output, In General

    Also, depending on your needs, have a look at using quietly or silence_stream for suppressing output in general, not just in the irb/console:

    silence_stream(STDOUT) do
      users = User.all
    end
    

    NOTE: silence_stream removed in Rails 5+.

    NOTE: quietly will be deprecated in Ruby 2.2.0 and will eventually be removed. (Thanks BenMorganIO!)

    More information can be found here.

    Work Around for Rails 5+.

    As mentioned above, silence_stream is no longer available because it is not thread safe. There is no thread safe alternative. But if you still want to use silence_stream and are aware that it is not thread safe and are not using it in a multithreaded manner, you can manually add it back as an initializer.

    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
    
    0 讨论(0)
  • 2020-12-07 14:41

    In search of a solution how to silence the irb/console output, I also found an answer at austinruby.com:

    silence irb:

    conf.return_format = ""
    

    default output:

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

    limit to eg 512 chars:

    conf.return_format = "=> limited output\n %.512s\n"
    
    0 讨论(0)
  • 2020-12-07 14:41

    running the following within irb works for me:

    irb_context.echo = false
    
    0 讨论(0)
  • 2020-12-07 14:43
    irb --simple-prompt --noecho
    
    • --simple-prompt - Uses a simple prompt - just >>
    • --noecho - Suppresses the result of operations
    0 讨论(0)
  • 2020-12-07 14:49

    Here, add this to your ~/.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
    

    (Note: You must install the ctx gem first, though awesome_print is optional, of course.)

    Now when you are on any console that uses irb, you can do the following:

    Normal mode:

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

    ...yep, just what you expect.

    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, now everything is printing out awesomely! :)

    Quiet mode:

    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 output at all? Nice.

    Anyways, you can add whatever mode you like, and when you're finished with that mode, just exit out or it, and you'll be back in the previous mode.

    Hope that was helpful! :)

    0 讨论(0)
  • 2020-12-07 14:53

    You can append ; nil to all your your commands/statements.

    Example:

    users = User.all; nil
    

    Actually irb prints the (return) value of the last executed statement. Thus in this case it'll print only nil as nil is the last executed valid statement :)

    0 讨论(0)
提交回复
热议问题