我在activeRecord类上有一个ruby方法(停用!)。但是,我似乎无法找到声明该方法的位置。
这个项目有很多开发人员,所以它可以在任何地方。有一个停用!在一个不相关的类上,但它似乎没有被调用。
任何想法如何找到实例的所有超类,或者在哪里找到停用的代码!?
答案 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的静态类型推断的好坏,它应该会带你到那里。
如果这不起作用,请在该调用上设置断点,启动调试器并单步执行方法。