2012-10-24 30 views
1

精细控制器相关的代码如下:的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修复了问题

+0

请向我们展示500错误 – agmin

+0

我在控制器代码和轨道控制台中看到的唯一区别是记录器的用法。你不记录rails控制台的情况,并且初始化@cost。你有没有尝试从控制器注释掉日志报告,并检查你是否得到500? – Raghu

+0

我建议开挖记录器并使用ruby-debug。它会保存你的理智。阅读第3部分:http://guides.rubyonrails.org/debugging_rails_applications.html –

回答

1

试试看

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

如果错误仍然存​​在,只是检查是否@cost是通过分配一个值,或与to_i方法的整数。

2

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

+0

请参阅编辑我的文章。 @cost正在初始化代码 – EastsideDeveloper

+0

好吧。试试这个\ @cost = \ @ cost.to_i + 50000 – 907th

+0

我不知道怎么写\ @ eithout \ =) – 907th

相关问题