如何调试gem中的错误?

时间:2011-02-18 13:06:15

标签: ruby-on-rails gem

我收到了Paperclip gem的错误。

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.size):
  paperclip (2.3.8) lib/paperclip/attachment.rb:104:in `assign'

我怎样才能调试它,就好像它是在宝石中一样?如果这是我的代码,我会放置一些puts来查看发生了什么,但我不能在这里做。我正在使用Rails 3.0.1

2 个答案:

答案 0 :(得分:3)

这是我最好的一击。

  • 打开其中一个控制器并向其添加debugger行。我们需要调试器来设置断点
  • 下一页run rails --debug
  • 使用断点
  • 导航到页面/控制器
  • 将出现调试器控制台。
  • 运行Gem.find_files("attachment.rb")< - 我将$ GEM_ROOT调用到此返回的路径
  • 运行list $GEM_ROOT/lib/paperclip/attachment.rb:104 - 这将显示发生错误的区域周围的代码。
  • 运行b $GEM_ROOT/lib/paperclip/attachment.rb:$LINE - 将$ LINE替换为断点的合适候选人。
  • 运行cont
  • 点击导致错误的页面/操作,调试控制台应该在断点处打开。

我认为必须有一种方法以编程方式获取gem文件的路径,但我不知道该怎么做:(

答案 1 :(得分:0)

接受的答案有效;然而,它就像去宝石源并插入debugger命令一样简单。

当rails提供您正在尝试的请求时,请注意是否已达到插入的debugger命令。使用控制器,您可能不会立即进入控制器。有时在过滤器或辅助方法之前会快速控制并返回。以devise gem before_filter :authenticate_user!为例。

如果您使用bundler,我们当前大多数人都这样做,从项目根目录发出的bundle show paperclip命令将显示在哪里找到paperclip gem的源代码。

此外,您需要在插入debugger语句后重新启动服务器。