Rails konsolu / irb çıkışları nasıl bastırılır


89

Oldukça garip bir problemle sıkışıp kaldım.

Rails Console'daki üretim sunucumuzdaki bazı db girişlerini test ediyordum; neredeyse tüm komutlar, ssh kanalının asılmasına bağlı olarak çok sayıda o / p satırına neden oluyordu :(

Konsol / irb ekranlarını bastırmanın bir yolu var mı?

Teşekkürler

Yanıtlar:


192

Ekleyebilirsiniz ; tüm komutlarınıza / ifadelerinize nil .

Misal:

users = User.all; nil

Aslında irb, son çalıştırılan ifadenin (dönüş) değerini yazdırır. Bu nedenle, bu durumda, sıfır çalıştırılan son geçerli ifade olduğu için yalnızca sıfır yazdıracaktır :)


13
Harika, daha da kısa bir yol users = User.all; 0
Bob

1
Bu sadece dönen nesneler için işe yarar, p ve koyarların çalışması için değil.
the_minted

bu sadece bir hack, Users.all.countsadece bir satır çıktısı gibi sayımı kullanabilirsiniz ve çıktıyı değişkende saklamak istiyorsanız şu şekilde yapılabilirusers = User.all; Users.all.count
Tasawar Hussain

31

İrb / konsol çıktısının nasıl susturulacağına dair bir çözüm ararken, austinruby.com'da da bir cevap buldum :

silence irb:

conf.return_format = ""

varsayılan çıktı:

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

örneğin 512 karakterle sınırlayın:

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

Çok kullanışlı. İrb / rails konsolunu açarken bunu ayarlamanın bir yolu var mı?
Kache

$ HOME / .irbrc içine koymayı deneyebilirsiniz
hdgarrood

8

Burada, ~ / .irbrc dosyanıza ekleyin:

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

(Not: ctxÖncelikle mücevheri yüklemelisiniz, awesome_printtabii ki isteğe bağlıdır.)

Artık irb kullanan herhangi bir konsoldayken aşağıdakileri yapabilirsiniz:

Normal mod:

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

... evet, tam da beklediğiniz gibi.

awesome_print mod:

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

... vay, şimdi her şey harika bir şekilde yazdırılıyor! :)

Sessiz mod:

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, hiç çıktı yok mu? Güzel.

Her neyse, istediğiniz modu ekleyebilir ve bu modla işiniz bittiğinde, hemen exitdışarıda veya o modda ekleyebilirsiniz ve önceki moda geri dönersiniz.

Umarım yardımcı olmuştur! :)


4

irb içinde aşağıdakileri çalıştırmak benim için çalışıyor:

irb_context.echo = false

4
irb --simple-prompt --noecho
  • --simple-prompt - Basit bir bilgi istemi kullanır - sadece >>
  • --noecho - İşlemlerin sonucunu baskılar

4

Çıkışı Bastır, Genel Olarak

Ayrıca, ihtiyaçlarınıza bağlı olarak , yalnızca irb / konsolda değil, genel olarak çıktıyı kullanma quietlyveya silence_streambastırma konusuna bakın:

silence_stream(STDOUT) do
  users = User.all
end

NOT: silence_streamRails 5+ ile kaldırılmıştır.

NOT: quietlyRuby 2.2.0'da kullanımdan kaldırılacak ve sonunda kaldırılacaktır. (Teşekkürler BenMorganIO !)

Daha fazla bilgiyi burada bulabilirsiniz .

5+ Rails için Çalışma.

Yukarıda belirtildiği gibi, silence_streamiş parçacığı açısından güvenli olmadığı için artık mevcut değildir. İş parçacığı için güvenli bir alternatif yoktur. Ancak yine de kullanmak istiyorsanız silence_streamve iş parçacığı açısından güvenli olmadığının farkındaysanız ve çok iş parçacıklı bir şekilde kullanmıyorsanız, onu yeniden başlatıcı olarak manuel olarak ekleyebilirsiniz.

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
Not quietlyRuby 2.2.0 kullanımdan kaldırılmış ve kaldırılacak gidiyor.
BenMorganIO

@BenMorganIO Cevaba bir not ekledi. Bunun için teşekkürler!
Joshua Pinter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.