Rails:应用程序失败但代码在控制台中运行良好

时间:2012-10-24 17:55:11

标签: ruby-on-rails ruby

控制器中的相关代码如下:

    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解决了问题

2 个答案:

答案 0 :(得分:2)

显式@cost初始化的区别。 在控制器操作开始时写@cost = 350000

答案 1 :(得分:1)

试试

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

如果错误仍然存​​在,只需通过分配值或使用to_i方法检查@cost是否为整数。