使用 Rails 仅仅 5 年,我不认为自己是高级 Railser,但是我很乐意分享我的知识。 :-)
处理任何(除了一些非常非常琐碎的问题)的主要事情是为此错误编写测试。
有几次我在这个阶段解决了这个错误——例如当这个错误与自动类重新加载有关时,它在开发中是活跃的,在测试模式下是关闭的。
然后我通常只放置一些logger.debug 语句,其中包含很多inspect 和caller(0).join("\n\t")。然后我非常仔细地检查了日志文件。
因为“test.log”可能有几百兆字节,所以我总是记得在运行测试之前将其归零。此外,我通常只运行一种测试方法,否则输出将无法读取。
我不使用专用调试器。在一些旧版本的 ruby 中,调试器停止工作,我学会了没有它就活下去,再也没有回头。
一些可能有用的实用程序:
在我的~/.bashrc 中定义的一个函数,它允许我调用单个测试方法(或一组方法):
$ testuj test/unit/user_test.rb -n test_name_validations
$ testuj test/unit/user_test.rb -n /_name_/
function testuj () {
if [ -n "${BUNDLE_GEMFILE}" ]
then
# This is a Rails3 project - it is run by `bundle exec`
ruby -I"lib:test" "$@"
else
# This is a Rails1 project. No bundler.
ruby -e 'ARGV.each { |f| load f unless f =~ /^-/ ; break if f == "-n" }' "$@"
fi
}
这种方法可以帮助我记录和检查某些步骤的时间:
Object.module_eval do
def czekpoint(note = nil)
n = Time.now
$czekpoint_previous ||= n
$czekpoint_number ||= 0
$czekpoint_number += 1
t = n - $czekpoint_previous
msg = "CZEKPOINT: %2d %8.6f %s %s" % [$czekpoint_number, t, caller.first.to_s.in_yellow, note.to_s.in_red]
Rails.logger.debug msg # In older Rails it was RAILS_DEFAULT_LOGGER
STDERR.puts msg
$czekpoint_previous = n
end
end