Как подавить выходы консоли / irb Rails

89

У меня возникла довольно странная проблема.

Я тестировал некоторые записи db на нашем производственном сервере в Rails Console, где почти все команды приводили к огромному количеству строк o / p, из-за которых канал ssh зависал :(

Есть ли способ подавить экраны консоли / irb?

Благодарность

ghtn
источник

Ответы:

191

Вы можете добавить ; nil ко всем вашим командам / операторам.

Пример:

users = User.all; nil

Фактически irb печатает (возвращаемое) значение последнего выполненного оператора. Таким образом, в этом случае он будет печатать только nil, поскольку nil - это последний выполненный действительный оператор :)

интеллигент
источник
13
Замечательно, еще более короткий путь - точка с запятой, за которой следует такой объект, какusers = User.all; 0
Bob
1
Это работает только для возвращаемых объектов, но не для p и put.
the_minted
это просто хак, вы можете просто использовать count, например Users.all.count, только одну строку вывода, и если вы хотите сохранить вывод в переменной, это можно сделать следующим образомusers = User.all; Users.all.count
Tasawar Hussain
31

В поисках решения, как заглушить вывод irb / console, я также нашел ответ на austinruby.com :

тишина irb:

conf.return_format = ""

вывод по умолчанию:

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

ограничение, например, 512 символов:

conf.return_format = "=> limited output\n %.512s\n"
LarsDK
источник
Очень полезно. Есть ли возможность установить это при открытии консоли irb / rails, т.е. создать псевдоним параметра в?
Kache
Вы можете попробовать поместить его в $ HOME / .irbrc
hdgarrood
8

Вот добавьте это в свой ~ / .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

(Примечание: ctxсначала вы должны установить гем, хотя awesome_print, конечно , это необязательно.)

Теперь, когда вы находитесь на любой консоли, которая использует irb, вы можете сделать следующее:

Нормальный режим:

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

... да, именно то, что вы ожидаете.

awesome_print Режим:

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

... ого, теперь все отлично распечатывается! :)

Бесшумный режим:

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>

... ну, вообще никакого выхода? Ницца.

В любом случае, вы можете добавить любой режим, который вам нравится, и когда вы закончите с этим режимом, просто exitотключите его, и вы вернетесь в предыдущий режим.

Надеюсь, это было полезно! :)

Мейсон Клауд
источник
4

у меня работает следующее в irb:

irb_context.echo = false
Schpet
источник
4
irb --simple-prompt --noecho
  • --simple-prompt - Использует простую подсказку - просто >>
  • --noecho - Подавляет результат операций
user3490179
источник
4

Подавить выход, в целом

Кроме того, в зависимости от ваших потребностей, обратите внимание на использование quietlyили silence_streamподавление вывода в целом, а не только в irb / console:

silence_stream(STDOUT) do
  users = User.all
end

ПРИМЕЧАНИЕ: silence_streamудалено в Rails 5+.

ПРИМЕЧАНИЕ: quietlyбудет объявлено устаревшим в Ruby 2.2.0 и в конечном итоге будет удалено. (Спасибо, BenMorganIO !)

Более подробную информацию можно найти здесь .

Работа с Rails 5+.

Как упоминалось выше, silence_streamон больше не доступен, так как не является потокобезопасным. Нет альтернативы потокобезопасности. Но если вы все еще хотите использовать silence_streamи знаете, что он не является потокобезопасным и не используете его многопоточным способом, вы можете вручную добавить его обратно в качестве инициализатора.

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
Обратите внимание, что quietlyэто устарело в ruby ​​2.2.0 и будет удалено.
BenMorganIO
@BenMorganIO Добавил примечание к ответу. Спасибо за это!
Джошуа Пинтер