Странное поведение консоли рельсов
-
12-10-2019 - |
Вопрос
Когда я запускаю многострочный оператор в консоли 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
Связаны ли эти проблемы? Как я могу их исправить?
Решение
В линии:
images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;
У тебя есть end
Чтобы закрыть if
но не end
Чтобы закрыть do
блок each
.
Вот почему консоль заново вызывает приглашение с просьбой получить больше ввода перед выполнением ваших операторов.
Пытаться:
images = Image.all;images.each do |im|; if im.imagestore_width.blank?;im.save;end;end
Обратите внимание, вы увидите то же поведение с кронштейнами. irb
или же console
не будет выполняться, пока кронштейны, например, сбалансировать
irb(main):010:0> (3 *
irb(main):011:1* (2 + 1)
irb(main):012:1> )
=> 9
Другие советы
Не так, что случилось с IRB/консоли, но ваш код Ruby может выглядеть намного приятнее:
images = Image.all.each { |im| im.save if im.imagestore_width.blank? }
Общий консенсус состоит в том, чтобы использовать {}, а не делать/конец для однострочных блоков в Ruby.