2

Мы портируем 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)

+0

Любая причина в пользу '(method.to_s + "_with_profiling") intern' над':. "# {Метод} _with_profiling" '? – tadman

+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 
+0

wow ... не могу поверить, что я пропустил его, что научит меня делать перерыв с Ruby :) –

+0

теперь следующий вопрос Мне нужно спросить, как получить разумное имя вида с крючка –

Смежные вопросы