1

コントローラ内の関連するコードは次のとおりです。

    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を使用すると問題が修正されました

4

2 に答える 2

2

明示的な@cost初期化の違い。@cost = 350000コントローラアクションの開始を書き込みます。

于 2012-10-24T18:00:59.657 に答える
1

ちょうど試して

if params.has_key?(:special_edition) && params[:special_edition] == "yes"

エラーが続く場合は、値を割り当てるか、to_iメソッドを使用して、@costが整数かどうかを確認してください。

于 2012-10-24T18:03:09.697 に答える