Как я нахожу, где рубиновый метод объявляется?

У меня есть рубиновый метод (деактивируйтесь!), который находится на activeRecord классе. Однако я, может казаться, не нахожу, где тот метод объявляется.

На этом проекте были многочисленные разработчики, таким образом, это могло быть где угодно. Существует деактивирование! на несвязанном классе, но это, кажется, не называют.

Любые идеи, как найти все суперклассы для instace, или где найти код для, деактивируются!?

15
задан Marc-André Lafortune 13 April 2010 в 15:56
поделиться

3 ответа

Когда мне нужно найти, где метод объявлен в каком-то классе, скажем «Модель», я ищу

Model.ancestors.find {|c| c.instance_methods(false).include? :deactivate! }

Это ищет дерево предков в том же порядок, который ruby ​​выполняет для первого, у которого есть метод в instance_methods (false) , который включает только ненаследуемые методы.

Примечание: до Ruby 1.9 методы указывались как строки, а не символы, поэтому это было бы

Model.ancestors.find {|c| c.instance_methods(false).include?('deactivate!') }
15
ответ дан 1 December 2019 в 02:01
поделиться

В качестве первого укола попробуйте функцию Перейти к объявлению в вашей среде IDE. В зависимости от того, насколько хороша логическая логика статического типа в вашей среде IDE, вы сразу же попадете туда.

Если это не сработает, установите точку останова для этого вызова, запустите отладчик и войдите в метод.

-1
ответ дан 1 December 2019 в 02:01
поделиться

Первый вопрос: действительно ли это метод? Вызывает ли obj.method (: deactivate!) ошибку?

Если это не так, вы можете использовать Method # source_location (только в Ruby 1.9, а backports не могут его поддерживать):

obj.method(:deactivate!).source_location

Если он действительно вызывает a NoMethodError , она обрабатывается через method_missing . Это затрудняет отслеживание. Если он принимает аргументы, я бы попробовал отправить неправильный тип и использовать трассировку поднятого исключения.

Вы используете state_machine ? Если у вас есть переход события под названием : deactivate , модель будет иметь метод #deactivate! создается автоматически.

17
ответ дан 1 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: