У меня есть рубиновый метод (деактивируйтесь!), который находится на activeRecord классе. Однако я, может казаться, не нахожу, где тот метод объявляется.
На этом проекте были многочисленные разработчики, таким образом, это могло быть где угодно. Существует деактивирование! на несвязанном классе, но это, кажется, не называют.
Любые идеи, как найти все суперклассы для instace, или где найти код для, деактивируются!?
Когда мне нужно найти, где метод объявлен в каком-то классе, скажем «Модель», я ищу
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!') }
В качестве первого укола попробуйте функцию Перейти к объявлению в вашей среде IDE. В зависимости от того, насколько хороша логическая логика статического типа в вашей среде IDE, вы сразу же попадете туда.
Если это не сработает, установите точку останова для этого вызова, запустите отладчик и войдите в метод.
Первый вопрос: действительно ли это метод? Вызывает ли obj.method (: deactivate!)
ошибку?
Если это не так, вы можете использовать Method # source_location
(только в Ruby 1.9, а backports
не могут его поддерживать):
obj.method(:deactivate!).source_location
Если он действительно вызывает a NoMethodError
, она обрабатывается через method_missing
. Это затрудняет отслеживание. Если он принимает аргументы, я бы попробовал отправить неправильный тип и использовать трассировку поднятого исключения.
Вы используете state_machine
? Если у вас есть переход события под названием : deactivate
, модель будет иметь метод #deactivate!
создается автоматически.