วิธีระงับ Rails console / irb outputs


89

ฉันติดอยู่กับปัญหาแปลก ๆ

ฉันกำลังทดสอบรายการ db ในเซิร์ฟเวอร์การผลิตของเราใน Rails Console ซึ่งคำสั่งเกือบทั้งหมดส่งผลให้มีบรรทัด o / p จำนวนมากเนื่องจากช่อง ssh กำลังถูกแขวนคอ :(

มีวิธีระงับหน้าจอคอนโซล / irb หรือไม่?

ขอบคุณ

คำตอบ:


192

คุณสามารถผนวก; ไม่มีคำสั่ง / คำสั่งของคุณทั้งหมด

ตัวอย่าง:

users = User.all; nil

จริงๆแล้ว irb พิมพ์ค่า (ส่งคืน) ของคำสั่งที่ดำเนินการล่าสุด ดังนั้นในกรณีนี้มันจะพิมพ์เฉพาะ nil เนื่องจาก nil เป็นคำสั่งที่ถูกต้องสุดท้ายที่ดำเนินการ :)


13
น่ากลัววิธีที่สั้นกว่านั้นคือเซมิโคลอนตามด้วยวัตถุเช่นusers = User.all; 0
Bob

1
สิ่งนี้ใช้ได้กับวัตถุที่ส่งคืนเท่านั้นไม่ใช่งานของ p และวาง
the_minted

มันเป็นแค่การแฮ็กคุณสามารถใช้การนับเช่น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"

มีประโยชน์มาก. มีโอกาสใดบ้างที่จะตั้งค่านี้ในขณะที่เปิดคอนโซล irb / rail เช่นนามแฝงพารามิเตอร์ใน?
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

Supress Output โดยทั่วไป

นอกจากนี้ขึ้นอยู่กับความต้องการของคุณดูที่การใช้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 เพิ่มหมายเหตุในคำตอบ ขอบคุณสำหรับสิ่งนั้น!
Joshua Pinter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.