2011-02-20 92 views
14

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' 

你知道爲什麼會出現這些錯誤嗎?

回答

27

這不是一個錯誤 - 它是Heroku如何讓你通過heroku console命令與你的應用程序進行交互的一個特性 - 雖然看起來像一個完全控制檯,但它根本不是。每行都通過http傳輸,並在您按Enter鍵時進行評估,因此您無法真正使用多行命令,但這種方式仍然有效;

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

,如果它不能在一行寫你需要使用編輯的rake任務或類似

:要包含正確的語法

+0

這實際上並沒有在我的Heroku控制檯上工作。它在'| user |'仍然失敗,類似於OP在'| c |'失敗的方式,我的語法和答案中寫的相同。 – iwasrobbed

+2

你也可以使用分號「;」在一條物理線上寫入多行代碼。 – mpoisot

+0

@mpoisot - 如何?你能舉個例子嗎? – sscirrus

4

這樣做的正確的語法是(至少在Heroku的Ruby 1.9.2):

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

利用約翰的方法並沒有爲我工作(我就遇到了這個問題第2個時間,所以現在是時候寫爲別人工作的答案)。

順便說一句,如果你想多行代碼,你必須在通過這一切爲這樣一行:

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

感謝您的回答! – sscirrus

0

我迄今發現的最好的方式執行的任意多行代碼長度Heroku的控制檯來包裝我的代碼爲一類包裝成一個類的方法的可執行代碼

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

然後粘貼到控制檯,現在按Enter

你的類是提供給你,你可以調用你在它定義的方法:

DoSomething.run

所以,這樣就沒有必要通過跳火圈和擠壓的一切到一個單一的行

相關問題