Мы портируем MiniProfiler на Ruby и хотим добавить автоматическое оборудование для просмотра и частичного просмотра Rails.Почему этот метод не может обработать ActionView :: Template: render?
Я знаю о поддержке existing instrumentation, но в идеале хочу получить «старт» и «остановить» события. Мы также хотели бы поддерживать более ранние версии Rails, которые не имеют поддержки уведомлений.
я изрубил короткий instrumenter и протестированные подключения делают с перед тем и после звонков:
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 :: Ошибка (неопределенный метод `html_safe» для ноль: NilClass)
Что не так с этим метод крюк? Что такое правильный надежный способ подключить методы, чтобы они не являются хрупкими этой проблемой (сохранение тривиального API: prof klass, method
)
Любая причина в пользу '(method.to_s + "_with_profiling") intern' над':. "# {Метод} _with_profiling" '? – tadman
не очень, я почищу его –