如何找到声明ruby方法的位置?

时间:2010-04-13 15:29:46

标签: ruby-on-rails ruby

我在activeRecord类上有一个ruby方法(停用!)。但是,我似乎无法找到声明该方法的位置。

这个项目有很多开发人员,所以它可以在任何地方。有一个停用!在一个不相关的类上,但它似乎没有被调用。

任何想法如何找到实例的所有超类,或者在哪里找到停用的代码!?

3 个答案:

答案 0 :(得分:17)

第一个问题是:它是一个实际的方法吗? obj.method(:deactivate!)会引发错误吗?

如果没有,那么你可以使用Method#source_location(仅在Ruby 1.9中,backports不支持它):

obj.method(:deactivate!).source_location

如果它确实引发NoMethodError,则会通过method_missing处理。这使得很难跟踪。如果它接受参数,我会尝试发送错误的类型并使用引发异常的回溯。

您使用的是state_machine吗?如果您有一个名为:deactivate的事件转换,则模型将自动创建方法#deactivate!

答案 1 :(得分:15)

当我需要找到在某个类上声明方法的位置时,比如说'Model',我做

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!') }

答案 2 :(得分:-1)

首先尝试IDE的 Jump to Declaration 功能。根据IDE的静态类型推断的好坏,它应该会带你到那里。

如果这不起作用,请在该调用上设置断点,启动调试器并单步执行方法。