在Heroku控制台上运行循环或多行代码

时间:2011-02-20 12:55:40

标签: ruby-on-rails ruby-on-rails-3 console 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'

你知道为什么会出现这些错误吗?

4 个答案:

答案 0 :(得分:29)

这不是错误 - 这是Heroku让你通过heroku console命令与你的应用程序进行交互的一个特性 - 虽然看起来像一个完整的控制台,但它根本就不是。每行都通过http传输,并在按Enter键时进行评估,因此您无法实际使用多行命令,但这样可以正常工作;

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

如果无法在一行中写入,则需要使用rake任务或类似

已编辑:包含正确的语法

答案 1 :(得分:6)

这个的正确语法是(至少对于Heroku上的Ruby 1.9.2):

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 }

答案 2 :(得分:0)

到目前为止,我发现在Heroku控制台中执行任意长度的多行代码的最好方法是将我的代码包装成一个包含在类方法中的可执行代码的类

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

然后将其粘贴到控制台中并按Enter键

现在您的课程可供您使用,您可以调用您在其上定义的方法:

  

DoSomething.run

所以,这样就没有必要跳过篮球并把所有东西都挤到一条线上

答案 3 :(得分:0)

聚会晚了一点,但是如果您使用Rails,也可以使用非常有用的rails runner命令

heroku run rails runner "
 User.find_each do |user| 
   user.update(active: true)
 end

 #Any other multiline logic
" -a my_app

我在示例中使用了#find_each,因为它适合于较大的对象集合。