Как мне найти, где объявлен метод ruby? - PullRequest
15 голосов
/ 13 апреля 2010

У меня есть метод ruby ​​(деактивировать!), Который находится в классе activeRecord. Тем не менее, я не могу найти, где этот метод объявлен.

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

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

Ответы [ 3 ]

17 голосов
/ 13 апреля 2010

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

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

obj.method(:deactivate!).source_location

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

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

15 голосов
/ 13 апреля 2010

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

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!') }
0 голосов
/ 13 апреля 2010

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

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

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