2016-04-11 2 views
3

У меня есть приложение, которое использует Ruby 1.8. 6 в приложении Rails 2.2.2.Как получить метод, который обрабатывает вызов метода

В нем много определений метода url_for в различных частях базы кода (классы, модули и т. Д.).

При отладке, я хотел бы увидеть в журнале, какой метод обрабатывает конкретный вызов url_for. Например,

foo = "bar" 
baz = url_for(foo) 
#would like to log the location of the url_for method which actually 
#handled the call, here. 

Это нормально, если единственный способ сделать это, чтобы вызвать исключение внутри url_for и посмотреть на трассировки стека, например

baz = url_for(something_which_wont_raise_here_but_will_raise_inside_the_url_for_method) 

Чтобы идти дальше, что, если этот метод является называется на экземпляре (сильно исправленный) класса:

foo = @baz.bar("qux") 

EDIT: Я не уточнил, что это Руби 1.8.6 в моем вопросе, и это выглядит как я не могу использовать .source_location метод. Очень жаль, что раньше не указывал версию! У кого-нибудь есть другие идеи?

+0

Не ясно. Вы хотите знать, где определяется метод (т. Е. Какой метод вызывается) или где вызывается метод? – sawa

+0

Это: «где метод определен (т. Е. Какой метод вызывается)» –

+0

Надеюсь, вы знаете, что эта версия Ruby не была сохранена для * очень * долгого времени и содержит множество незафиксированных ошибок, в том числе, но не ограниченные, дыры в безопасности. –

ответ

2

Это звучит, как вы хотите сделать

method(:url_for) 

получить Method объект, а затем использовать source_location, чтобы выяснить, где он был определен

+1

Спасибо. V жаль, но просто понял, что у меня нет этого метода в версии этого рубика - см. Мое редактирование. –

+0

Не знаю, извините - прошло очень много времени с тех пор, как была выпущена эта версия. –

1

Вы можете использовать method и source_location Методы цепи, чтобы получить расположение определения метода.

Например:

Example

+0

Спасибо. Что бы я сделал в случае, когда метод вызывается для объекта, например 'foo = @ baz.bar (" qux ")', и мне хотелось узнать, какой метод 'bar' вызывается? (давайте представим, что @baz - это пример сильно исправленного класса, и это не очевидно) –

+0

@MaxWilliams Вы можете достичь этого с помощью: '@ baz.method (: bar) .source_location' –

+0

Спасибо. V жаль, но просто понял, что у меня нет этого метода в версии этого рубика - см. Мое редактирование. –

1

Если вы:

method(:url_for).owner 

Это даст вам модуль/класс, в котором определен метод. Этого должно быть достаточно, чтобы дать вам возможность идентифицировать метод (если один и тот же метод не будет избыточно определен в одном модуле несколько раз). Затем вы можете посмотреть определение url_for в этом модуле/классе.

+1

Спасибо. V жаль, но просто понял, что у меня нет этого метода в версии этого рубика - см. Мое редактирование. –