Запуск циклов или многострочный код на консоли Heroku

Консоль 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'

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

Ответы

Ответ 1

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

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

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

EDITED: чтобы содержать правильный синтаксис

Ответ 2

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

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

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

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

User.all.each {|user| user.some_attribute = true; user.some_other_attribute = false; user.save }

Ответ 3

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

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

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

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

DoSomething.run

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