如何在Rails应用程序中有选择地跟踪方法及其文件访问?

时间:2012-02-01 21:10:14

标签: ruby-on-rails ruby ruby-on-rails-3

对于Rails应用程序,我想重载或修改Kernel :: load,以便为每个加载的Rails应用程序文件打印出puts "-> #{File.expand_path(File.dirname(__FILE__))}/#{File.basename(__FILE__)}"的完整路径。

我该怎么做?我想进一步能够过滤,所以我猜我会在那里抛出一个正则表达式,只能显示输出(当我不希望它非常冗长时)表明文件内的文件访问权限current rails app root。

无论如何,我很欣赏一个重载此方法的示例,以及在服务器启动时在Rails应用程序中执行此操作的适当位置。

解决:

好吧,在经历了一些事情并发现set_trace_func之后我想出了以下内容:

我将set_trace_fun整合到development.rb的标题中,沿着mtrace gem中实现的内容。我做了很多调整来过滤除了我的应用程序目录以及其他一些繁琐的方法之外的所有东西,但它似乎到目前为止一直在努力。与修改有效集成的mtrace源如下:

mtrace_indent = 0
set_trace_func lambda {|event, file, line, id, binding, klass|
  case event
  when 'call'
    puts "\e[90m| " * mtrace_indent +
      "\e[35m#{klass}\e[90m#\e[36m#{id} \e[90m#{file}:#{line}\e[0m" +
      "#{'  ' * ([10 - mtrace_indent, 1].max)}\e[90mtxmt://open/?url=file://#{ File.expand_path(file) }&line=#{ line }\e[0m"
    mtrace_indent += 1
  when 'return'
    mtrace_indent -= 1
  end
  mtrace_indent = 0 if mtrace_indent < 0
}

当然,如果您不在Mac上,可以删除txmt url部分,但这确实非常有用。

1 个答案:

答案 0 :(得分:4)

试试这个:

module Kernel
  alias_method :old_load, :load

  def load filename, wrap = false
    puts "-> #{filename}"
    old_load filename, wrap
  end
end

您可以将其放入config/initializers,但对于您尝试的操作可能会有点迟。

显然,Rails初始化进程starts with config/environment.rb,所以如果你把这个代码放在那个文件的顶部,它应该是第一个加载的东西。