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 控制台),并运行此代码(取自日志文件的值:

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 回答