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

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

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

任何想法如何找到一个instace的所有超类,或在哪里找到停用的代码!?

当我需要在某个类中找到声明方法的位置时,请说“模型”,我这样做

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

这将按照ruby为第一个具有instance_methods(false)的方法的顺序搜索祖先树,该方法仅包含非inheritance方法。

注意:在ruby 1.9之前,这些方法被列为字符串而不是符号,所以它会是

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

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

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

 obj.method(:deactivate!).source_location 

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

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

作为第一个尝试,尝试IDE的Jump to Declarationfunction。 根据IDE的静态类型推断的好坏,它应该就在那里。

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