控制器中的相关代码如下:
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解决了问题
答案 0 :(得分:2)
显式@cost初始化的区别。
在控制器操作开始时写@cost = 350000
。
答案 1 :(得分:1)
试试
if params.has_key?(:special_edition) && params[:special_edition] == "yes"
如果错误仍然存在,只需通过分配值或使用to_i方法检查@cost是否为整数。