精细控制器相关的代码如下:的Rails:应用程序失败,但代码运行在控制台
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
如果我进入控制台(轨控制台),并运行此代码(从日志文件中获取值:
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,并把它变成一个字符串。这被应用程序中的另一个bug掩盖了,所以较早的测试失败了。故事的道德:回归测试是至关重要的。使用@ cost.to_i修复了问题
请向我们展示500错误 – agmin
我在控制器代码和轨道控制台中看到的唯一区别是记录器的用法。你不记录rails控制台的情况,并且初始化@cost。你有没有尝试从控制器注释掉日志报告,并检查你是否得到500? – Raghu
我建议开挖记录器并使用ruby-debug。它会保存你的理智。阅读第3部分:http://guides.rubyonrails.org/debugging_rails_applications.html –