我们正在将MiniProfiler移植到 Ruby,并希望为 Rails 视图和局部视图添加自动检测。
我知道现有的仪器支持,但理想情况下希望获得“开始”和“停止”事件。我们还希望支持不支持通知的早期版本的 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(nil:NilClass 的未定义方法 `html_safe')
这个方法钩子有什么问题?什么是挂钩方法的适当健壮方法,以便它们不会受到这个问题的影响(维护微不足道的 API prof klass, method
:)