Как выборочно отслеживать методы и их доступ к файлам в приложении Rails? - PullRequest
3 голосов
/ 02 февраля 2012

Для приложения Rails я бы хотел перегрузить или изменить Kernel :: load так, чтобы он выводил полный путь, например puts "-> #{File.expand_path(File.dirname(__FILE__))}/#{File.basename(__FILE__)}", для каждого загружаемого файла приложения Rails.

Как бы ясделай это?Я хотел бы дополнительно иметь возможность фильтровать, так что я предполагаю, что я бы добавил туда регулярное выражение, чтобы иметь возможность показывать только вывод (когда я не хочу, чтобы он был слишком многословным), который указывает на доступ к файлам внутритекущий каталог приложения rails.

В любом случае, я был бы признателен за пример перегрузки этого метода и того, где подходящее место для этого было бы активным в приложении Rails при запуске сервера.

Разрешение:

Что ж, хорошо, после того, как я немного разбил все вокруг и обнаружил set_trace_func Я придумал следующее:

Я интегрировал set_trace_fun в заголовокdevelopment.rb в соответствии с тем, что было реализовано в геме mtrace.У меня было много настроек, чтобы отфильтровать все, кроме моего каталога приложений, а также ряд других болтливых методов, но пока это работает.Источник 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
}

Конечно, части URL txmt можно удалить, если вы не на Mac, но это действительно очень полезно.

1 Ответ

4 голосов
/ 02 февраля 2012

Попробуйте:

module Kernel
  alias_method :old_load, :load

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

Вы можете поместить это в config/initializers, но это может быть немного поздно для того, что вы пытаетесь сделать.

Очевидно, RailsПроцесс инициализации начинается с config/environment.rb, поэтому, если вы поместите этот код в начало этого файла, он должен быть загружен первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...