Cara menekan keluaran Rails console / irb


89

Saya terjebak dengan masalah yang cukup aneh.

Saya menguji beberapa entri db di server produksi kami di Rails Console di mana hampir semua perintah menghasilkan sejumlah besar jalur output daya, yang menyebabkan saluran ssh digantung :(

Apakah ada cara untuk menekan screenfuls konsol / irb?

Terima kasih

Jawaban:


191

Anda bisa menambahkan ; nol untuk semua perintah / pernyataan Anda.

Contoh:

users = User.all; nil

Sebenarnya irb mencetak nilai (kembali) dari pernyataan yang terakhir dieksekusi. Jadi dalam kasus ini hanya akan mencetak nil karena nil adalah pernyataan valid terakhir yang dieksekusi :)


13
Hebat, cara yang bahkan lebih pendek adalah titik koma diikuti oleh objek sepertiusers = User.all; 0
Bob

1
Ini hanya berfungsi untuk objek yang dikembalikan, bukan pekerjaan p dan put.
the_minted

Ini hanya retasan, Anda hanya dapat menggunakan hitungan, seperti Users.all.count, hanya satu baris keluaran, dan jika Anda ingin menyimpan keluaran dalam variabel dapat dilakukan seperti iniusers = User.all; Users.all.count
Tasawar Hussain

31

Dalam mencari solusi bagaimana membungkam keluaran irb / konsol, saya juga menemukan jawaban di austinruby.com :

diam irb:

conf.return_format = ""

keluaran default:

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

batas hingga misalnya 512 karakter:

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

Sangat berguna. Adakah kemungkinan ada cara untuk mengatur ini saat membuka konsol irb / rails, yaitu alias parameter di?
Kache

Anda dapat mencoba memasukkannya ke $ HOME / .irbrc
hdgarrood

8

Di sini, tambahkan ini ke ~ / .irbrc Anda:

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

(Catatan: Anda harus menginstal ctxpermata terlebih dahulu, meskipun awesome_printopsional, tentu saja.)

Sekarang ketika Anda berada di konsol mana pun yang menggunakan irb, Anda dapat melakukan hal berikut:

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

... ya, persis seperti yang Anda harapkan.

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, sekarang semuanya dicetak dengan luar biasa! :)

Mode diam:

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, tidak ada keluaran sama sekali? Bagus.

Bagaimanapun, Anda dapat menambahkan mode apa pun yang Anda suka, dan ketika Anda selesai dengan mode itu, baru exitkeluar atau itu, dan Anda akan kembali ke mode sebelumnya.

Semoga bermanfaat! :)


4

menjalankan yang berikut dalam irb berfungsi untuk saya:

irb_context.echo = false

4
irb --simple-prompt --noecho
  • --simple-prompt - Menggunakan prompt sederhana - hanya >>
  • --noecho - Menekan hasil operasi

4

Tekan Output, Secara Umum

Juga, tergantung pada kebutuhan Anda, lihat menggunakan quietlyatau silence_streamuntuk menekan keluaran secara umum, tidak hanya di irb / konsol:

silence_stream(STDOUT) do
  users = User.all
end

CATATAN: silence_streamdihapus di Rails 5+.

CATATAN: tidak quietlyakan digunakan lagi di Ruby 2.2.0 dan pada akhirnya akan dihapus. (Terima kasih BenMorganIO !)

Informasi lebih lanjut dapat ditemukan di sini .

Bekerja untuk Rails 5+.

Seperti disebutkan di atas, silence_streamtidak lagi tersedia karena tidak aman untuk utas. Tidak ada alternatif yang aman untuk benang. Tetapi jika Anda masih ingin menggunakan silence_streamdan menyadari bahwa ini bukan thread safe dan tidak menggunakannya secara multithread, Anda dapat menambahkannya kembali secara manual sebagai penginisialisasi.

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
Perhatikan bahwa quietlytidak digunakan lagi di ruby ​​2.2.0 dan akan dihapus.
BenMorganIO

@BenMorganIO Menambahkan catatan ke jawabannya. Terima kasih untuk itu!
Joshua Pinter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.