2011-11-08 20 views
1

有人能告訴我,爲什麼這個工程:爲什麼我的object.save在一個地方工作而在另一個地方失敗?

require 'rubygems' 
require 'mysql2' 

@inverters=Inverter.where(:mac=>@mac) 
Inverter.transaction do 
    @inverters.each do |inverter| 
    inverter.ip = @client_ip 
    inverter.save    # Object is saved:)! 
    end 
end 

但這並不?:

require 'rubygems' 
require 'mysql2' 

@outputs=<a two dimensional hash> 
Output.transaction do 
    @outputs.each do |out|   
    @newOut = Output.new 
    @newOut.inverter_id = out[:inverter_id] 
    @newOut.eac = out[:eac] 
    @newOut.pac = out[:pac] 
    @newOut.vac = out[:vac] 
    @newOut.iac = out[:iac] 
    @newOut.epv = out[:epv] 
    @newOut.ppv = out[:ppv] 
    @newOut.vpv = out[:vpv] 
    @newOut.save     # Object fails to save to db:(. 

    # 2 lines of other code 
    end 
end 

兩個對象都保存成功,當我在鐵軌控制檯手動輸入相同的命令,但第二個在我的腳本中失敗。我已經做了大量的調試,確保所有變量('out'和'@outputs')都具有期望的值,並且它們都在控制檯中工作。我使用Ruby 1.8.7,Rails 3.0.3和mysql2 gem version 0.2.7。提前感謝你!

+0

嘗試將您的'save'調用更改爲'save!' - 它們是相同的,除了'save'將返回'true'或'false',這取決於保存是否成功。 'save!'在保存失敗時拋出一個異常,詳細說明失敗的原因,或者在保存工作時正常保存。這對調試這樣的問題非常有用! –

+0

偉大的我會嘗試!我也忘了提及'@ newOut.save'正在返回true,即使我可以看到它在檢查db時沒有保存。你知道這會發生嗎? – pitachip

回答

0

我做的第一件事就是在終端中打開一個單獨的選項卡,導航到我的rails應用程序文件夾並通過鍵入以下命令行跟隨mySQL在幕後執行的操作:tail -f log /development.log。我可以看到在運行上面第二個不工作的腳本時,在INSERT到輸出表格行之後的日誌中,它只會說'ROLLBACK'。發生這種情況的原因是我的@ newOut.save語句後有兩行隨機代碼。當我將這兩條線從事務循環中取出時,一切都奏效了。這顯然是一個全新的錯誤,但我希望它能幫助別人。

相關問題