【问题标题】:Strange Rails console behaviour奇怪的 Rails 控制台行为
【发布时间】:2011-01-19 10:15:44
【问题描述】:

当我在 Rails 3.0.1 控制台中运行多行语句时,按 enter 并不会实际运行该语句。相反,它转到一个新的控制台行,并且光标已被标记到右侧。然后我要运行一个基本的行(比如p "hey"),然后多行语句就会运行。

ruby-1.9.2-p0 > images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
ruby-1.9.2-p0 >     p "hey"

我已经这样做了一段时间,并且运行良好。但是现在我在控制台中遇到了一个问题,它可能是相关的。当我运行上面的代码时,它并没有像往常一样工作,它只是转到一个带有 ? 的新控制台行。添加了

ruby-1.9.2-p0 > images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
ruby-1.9.2-p0 >     p "hey"
ruby-1.9.2-p0 ?>

执行此操作时,我无法退出控制台

ruby-1.9.2-p0 ?>  exit
ruby-1.9.2-p0 ?>  ^C

这些问题有关系吗?我该如何解决?

【问题讨论】:

  • 编写一个脚本并用你的跑步者启动它。

标签: ruby-on-rails rails-console


【解决方案1】:

行内:

images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;

您有一个end 来关闭if,但没有一个end 来关闭eachdo 块。

这就是为什么控制台在执行语句之前重新显示提示要求更多输入的原因。

试试:

images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;end

请注意,您将看到与括号相同的行为。 irbconsole 在括号平衡之前不会执行,例如

irb(main):010:0> (3 *
irb(main):011:1* (2 + 1)
irb(main):012:1> )
=> 9

【讨论】:

    【解决方案2】:

    不知道 irb/console 有什么问题,但您的 ruby​​ 代码可能看起来更好:

    images = Image.all.each { |im| im.save if im.imagestore_width.blank? }
    

    普遍的共识是对 ruby​​ 中的单行块使用 {} 而不是 do/end。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多