如何找到声明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的静态类型推断的好坏,它应该就在那里。
如果这不起作用,请在该调用上设置断点,启动调试器并进入该方法。