为什么这个方法无法使用ActionView :: Template:render?

时间:2012-04-13 04:15:09

标签: ruby-on-rails ruby ruby-on-rails-3 metaprogramming mvc-mini-profiler

我们正在将MiniProfiler移植到Ruby,并希望为Rails视图和局部视图添加自动检测。

我知道existing instrumentation支持但理想情况下想要获得“开始”和“停止”事件。我们还想支持没有通知支持的早期版本的Rails。

我修了一个简短的仪表,并在之前用之后的测试了渲染渲染:

def prof(klass, method)
  with_profiling = (method.to_s + "_with_profiling").intern
  without_profiling = (method.to_s + "_without_profiling").intern

  klass.send :alias_method, without_profiling, method
  klass.send :define_method, with_profiling do |*args, &orig|
    puts "before #{method} #{args}"
    self.send without_profiling, *args, &orig
    puts "after #{method}"
  end
  klass.send :alias_method, method, with_profiling
end

prof ActionView::Template, :render

但是,一旦激活,render未正确检测。特别是这适用于某些部分,但是使用:

进行爆炸
  

ActionView :: Template :: Error(未定义的方法`html_safe'代表nil:NilClass)

这个方法钩有什么问题?什么是一种适当的强大方法来挂钩方法,因此它们不容易解决这个问题(维护简单的API:prof klass, method

1 个答案:

答案 0 :(得分:2)

您已重新定义该方法,以返回最终puts的结果,通常为nil。修复可能是:

klass.send :define_method, with_profiling do |*args, &orig|
  puts "before #{method} #{args}"
  result = self.send without_profiling, *args, &rig
  puts "after #{method}"

  result
end