Запуск циклов или многострочный код на консоли Heroku - PullRequest
15 голосов
/ 20 февраля 2011

Консоль Heroku не запускает циклы в моем приложении (хотя они работают на моем локальном компьютере, а heroku позволяет выполнять отдельные действия).

@companies.each do |c|
SyntaxError: /home/heroku_rack/lib/console.rb:150: syntax error, unexpected $end
@companies.each do |c|
                      ^
/home/heroku_rack/lib/console.rb:140:in `eval'
/home/heroku_rack/lib/console.rb:140:in `_eval'
/home/heroku_rack/lib/console.rb:73:in `block in process_command'
/usr/ruby1.9.2/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'

Знаете ли вы, почему эти ошибки могут возникать?

Ответы [ 3 ]

29 голосов
/ 20 февраля 2011

это не ошибка - это особенность того, как Heroku позволяет вам взаимодействовать с вашим приложением с помощью команды heroku console - хотя это выглядит как полноценная консоль, это просто не так. Каждая строка передается по http и оценивается, когда вы нажимаете ввод, поэтому вы не можете использовать многострочные команды, это будет работать, хотя;

User.all.each {|user| user.update_attributes(:active => true) }

если он не может быть записан в одну строку, вам нужно использовать грабли или что-то вроде

РЕДАКТИРОВАНИЕ: Содержать правильный синтаксис

6 голосов
/ 19 мая 2011

Правильный синтаксис для этого будет (по крайней мере для Ruby 1.9.2 на Heroku):

User.all.each {|user| user.update_attributes(:active => true)}

Использование метода Джона у меня не сработало (и я столкнулся с этой проблемой во второй раз, так что пришло время написать ответ, который сработал для других).

Кстати, если вам нужно несколько строк кода, вы должны передать все это в одну строку, например:

User.all.each {|user| user.some_attribute = true; user.some_other_attribute = false; user.save }
0 голосов
/ 25 августа 2017

Наилучший способ, которым я до сих пор находил выполнение многострочного кода произвольной длины в консоли Heroku, - это обернуть мой код в класс с помощью исполняемого кода, заключенного в метод класса

class DoSomething
  def self.run
    puts "line1"
    puts "line2 .... etc"
  end
end

затем вставьте это в консоль и нажмите Enter

Теперь ваш класс доступен для вас, и вы можете вызвать метод, который вы определили для него:

DoSomething.run

итак, нет необходимости прыгать через обручи и втискивать все в одну строку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...