2011-11-08 8 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 
私はレールコンソールで手動で同じコマンドを入力すると、両方のオブジェクトが正常に保存

が、2番目の1 ?:ていません私のスクリプト内で失敗します。私は、すべての変数( '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'がdbの検査時に保存されていないことがわかっていてもtrueを返すと言及するのを忘れていました。これがどうなるか知っていますか? – pitachip

答えて

0

私がこれを理解した最初のことは、端末に別のタブを開き、レールアプリのフォルダに移動して、舞台裏で次の行を入力してmySQLを実行することでした:tail -f log /development.log。上記のスクリプトを実行していない2番目のスクリプトを実行すると、出力テーブル行にINSERTした後、ログに「ROLLBACK」と表示されることがあります。これが起こった理由は、@ newOut.saveステートメントの後に2行のランダムコードがあることでした。トランザクションループからこれらの2行を取り出したとき、すべてがうまくいきました。これは明らかに初心者のエラーですが、誰かを助けてくれることを願っています。

関連する問題