コントローラ内の関連するコードは次のとおりです。
logger.info("Dumping params")
logger.info(params)
logger.info("Dumping initial cost:")
logger.info(@cost)
logger.info("entering if statement")
if params.has_key?("special_edition") && params["special_edition"] == 'yes'
@cost = @cost + 50000
end
logger.info("If we get to here then the first conditional executed correctly")
if params.has_key?("number_of_lids") && params["number_of_lids"].to_i > 0
@cost = @cost + (params["number_of_lids"].to_i * 5000)
end
logger.info("If we get to here then the second conditional executed correctly")
logger.info("printing final cost:")
logger.info(@cost)
アプリを実行すると、500エラーが発生します。ログファイル(テストログファイル)をチェックインすると、次のように表示されます。
Dumping params
{"utf8"=>"✓", "special_edition"=>"yes", "number_of_lids"=>"3", "action"=>"create"}
Dumping initial cost:
350000
entering if statement
Completed 500 Internal Server Error in 1922ms
コンソール(rails console)に入り、このコードを実行すると(ログファイルから取得した値:
params = {"utf8"=>"✓", "special_edition"=>"yes", "number_of_lids"=>"3", "action"=>"create"}
@cost = 350000
if params.has_key?("special_edition") && params["special_edition"] == 'yes'
@cost = @cost + 50000
end
if params.has_key?("number_of_lids") && params["number_of_lids"].to_i > 0
@cost = @cost + (params["number_of_lids"].to_i * 5000)
end
次に、@ costの正しい結果が得られます:415000
500エラーが発生する理由はありますか?
明確化:
いくつかの回答では、違いは@costを初期化しているが、コントローラーでは初期化していないことです。@costを初期化するコードは、すでに適切に初期化されているため、含まれていません。@costをログファイルに記録するコードを含め、ログファイルから@costに対して取得した値を使用して、コンソールで初期化しています(コード、3行目と4行目、およびログファイルの3行目と4行目)
コメント機能を使おうとしましたが、stackoverlfowからエラーメッセージが表示されます。
解像度
アプリ内の別のモジュールがinterget@costを読み取り、それを文字列に変換していたことがわかりました。これはアプリの別のバグによってマスクされていたため、以前のテストは失敗しました。話の教訓:回帰テストは不可欠です。@cost.to_iを使用すると問題が修正されました