如何在rake db:seed期间在终端中获得动态输出

时间:2016-05-24 20:33:14

标签: ruby ruby-on-rails-3 seeding

我正在处理一个相当冗长的seed.rb文件。

由于rake任务需要一段时间才能完成,我想通过控制台向用户提供视觉反馈,以便他们知道该过程正在运行。

到目前为止,我有:

puts "Topic: #{i}, created..."

在create循环中。但是,它会终止终端输出。我想做的是让输出看起来像这样:

Topic: #1..N, created...

其中输出全部保持在同一行,而不创建/n换行符,就像当前输出的样子一样:

Topic: #1, created...
Topic: #2, created...
Topic: #3, created...
Topic: #N, created...

我试图摆弄print,但它只是在终端线的末尾创建一个长字符串。

这是整个seed.rb代码:

topic_list = []
i = 1
(0..9).map{
  topic_list << [ Faker::Lorem.words(rand(2..5)), Faker::Lorem.sentences(rand(3..7)), rand(1..6) ]
}
topic_list.each do |title, content, author|
  Topic.create!( title:title, content:content, author:author )
  puts "Topic: #{i}, #{title} created..."
  i += 1
end

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

处理控制台是旧学校,与使用浏览器和HTML呈现页面非常不同。

控制台使用马车控制字符,如&#34; \ t&#34;,&#34; \ r&#34;,&#34; \ n&#34;。有others,但这些是最常用的。

&#34; \ R&#34;和&#34; \ n&#34;手拉手往前走。 &#34; \ R&#34;意味着将马车返回原位,&#34; \ n&#34;意味着前进到下一行。在终端&#34; \ r&#34;导致将光标移动到最左侧位置。

将其保存到脚本并在命令行运行:

print "foo\r"
sleep 1
print "bar\r"
sleep 1
puts "done"

你会看到&#34; foo&#34;打印,用光标翻过&#34; f&#34;,然后&#34; bar&#34;,用光标翻过&#34; b&#34;,然后&#34;完成&#34;打印,光标将移动下一行。

puts的行为与print不同;为什么留给你发现。

另外,只需附加&#34; \ r&#34;如果某些行的长度比其他行短,则不足以生成好看的进度消息。互联网上有很多关于如何处理这个问题的不同教程,我确信有Ruby软件包。一些搜索应该揭示那些。