Cách chặn đầu ra Rails console / irb


89

Tôi bị mắc kẹt với một vấn đề khá kỳ lạ.

Tôi đang kiểm tra một số mục db trong máy chủ sản xuất của chúng tôi trong Rails Console, nơi hầu như tất cả các lệnh đều dẫn đến một số lượng lớn các dòng o / p, do đó kênh ssh đang bị treo :(

Có cách nào để ngăn chặn màn hình console / irb không?

Cảm ơn

Câu trả lời:


190

Bạn có thể nối thêm ; không cho tất cả các lệnh / câu lệnh của bạn.

Thí dụ:

users = User.all; nil

Trên thực tế, irb in ra giá trị (trả về) của câu lệnh được thực thi cuối cùng. Vì vậy, trong trường hợp này, nó sẽ chỉ in nil vì nil là câu lệnh hợp lệ được thực thi cuối cùng :)


13
Tuyệt vời, một cách thậm chí ngắn hơn là dấu chấm phẩy theo sau là một đối tượng nhưusers = User.all; 0
Bob

1
Điều này chỉ hoạt động đối với các đối tượng được trả về, không hoạt động của p và put.
the_minted

nó chỉ là một hack, bạn chỉ có thể sử dụng số lượng, giống như Users.all.count, chỉ có một ngõ ra, và nếu bạn muốn để lưu trữ kết quả trong biến thể được thực hiện như thế nàyusers = User.all; Users.all.count
Tasawar Hussain

31

Để tìm kiếm giải pháp làm thế nào để tắt đầu ra irb / console, tôi cũng đã tìm thấy câu trả lời tại austinruby.com :

im lặng irb:

conf.return_format = ""

đầu ra mặc định:

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

giới hạn ví dụ 512 ký tự:

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

Rất hữu dụng. Bất kỳ cơ hội nào có cách để đặt điều này trong khi mở bảng điều khiển irb / rails, tức là bí danh một tham số trong?
Kache

Bạn có thể thử đưa nó vào $ HOME / .irbrc
hdgarrood

8

Tại đây, thêm cái này vào ~ / .irbrc của bạn:

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

(Lưu ý: Bạn phải cài đặt ctxgem trước, mặc dù tất nhiên awesome_printlà tùy chọn.)

Bây giờ khi bạn đang ở trên bất kỳ bảng điều khiển nào sử dụng irb, bạn có thể làm như sau:

Chế độ bình thường:

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

... vâng, đúng như những gì bạn mong đợi.

awesome_print chế độ:

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, bây giờ mọi thứ đang in ra một cách đáng kinh ngạc! :)

Chế độ yên lặng:

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, không có đầu ra nào cả? Đẹp.

Dù sao, bạn có thể thêm bất kỳ chế độ nào bạn thích và khi bạn hoàn thành chế độ đó, chỉ cần exitthoát hoặc nó và bạn sẽ quay lại chế độ trước đó.

Hy vọng điều đó hữu ích! :)


4

chạy phần sau trong irb phù hợp với tôi:

irb_context.echo = false

4
irb --simple-prompt --noecho
  • --simple-prompt - Sử dụng một lời nhắc đơn giản - chỉ >>
  • --noecho - Ngăn chặn kết quả của hoạt động

4

Đầu ra Supress, nói chung

Ngoài ra, tùy thuộc vào nhu cầu của bạn, hãy xem cách sử dụng quietlyhoặc silence_streamđể loại bỏ đầu ra nói chung, không chỉ trong irb / console:

silence_stream(STDOUT) do
  users = User.all
end

LƯU Ý: silence_streambị loại bỏ trong Rails 5+.

LƯU Ý: quietlysẽ không được chấp nhận trong Ruby 2.2.0 và cuối cùng sẽ bị loại bỏ. (Cảm ơn BenMorganIO !)

Thông tin thêm có thể được tìm thấy ở đây .

Làm việc xung quanh cho Rails 5+.

Như đã đề cập ở trên, silence_streamkhông còn khả dụng vì nó không phải là chủ đề an toàn. Không có thay thế an toàn chủ đề. Nhưng nếu bạn vẫn muốn sử dụng silence_streamvà biết rằng nó không an toàn cho luồng và không sử dụng nó theo cách đa luồng, bạn có thể thêm lại nó làm trình khởi tạo theo cách thủ công.

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
Xin lưu ý rằng phiên bản quietlyruby 2.2.0 không được dùng nữa và sẽ bị xóa.
BenMorganIO

@BenMorganIO Đã thêm ghi chú vào câu trả lời. Cảm ơn vì điều đó!
Joshua Pinter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.