我有一堆代码要看,现在是调试时间.由于我从未成为Ruby调试器的粉丝,因此我正在寻找一种通过代码并阅读它的方法.
我想要做的是获取定义加载类的文件的位置:
Foo::Bar.create(:param) # how can I know file location in runtime?
Run Code Online (Sandbox Code Playgroud)
对于规模较小,组织较好的项目,我只会搜索,class Bar但这里不可能,因为有很多类命名Bar,更糟糕的是,其中一些属于同一名称空间.我知道,等待发生的麻烦.
注意:我使用的是Ruby 1.8.7.
你如何检查已经对Ruby中的特定类进行了猴子修补?如果可能的话,是否也可以获得已修补的属性的先前实现?
使用Ruby 1.8.6/Rails 2.3.2
我注意到在我的任何ActiveRecord模型类上调用的任何方法都返回nil而不是NoMethodError.除了恼人的,这是打破了动态查找器(find_by_name,find_by_id,等),因为他们总是返回nil即使记录存在.不从ActiveRecord :: Base派生的标准类不受影响.
有没有办法在ActiveRecord :: Base之前跟踪什么是拦截method_missing?
更新:
切换到1.8.7后,我发现(感谢@MichaelKohl)will_paginate插件首先处理method_missing.但是will_paginate在我们的系统中已经存在了很长一段时间(并且没有改变),罪魁祸首必须是后来的链接.任何想法如何看到这个链中的下一步?
更新:
事实证明,有一个gem(annotate-2.4.0)是猴子修补ActiveRecord::Base#method_missing作为一个空白的方法.卸载gem解决了我的问题.虽然没有给出的答案实际上找到了问题,但@Yanhao的答案最接近,因为它只需要一个小调整来发现有问题的别名方法
我正在开展一个非常大的铁路项目.有时我需要寻找类/常量定义.Ruby中有一些内置的方法可以帮我吗?例:
irb> SOME_CONSTANT.__file__
=> /some/path/to/a/file
Run Code Online (Sandbox Code Playgroud) 我有一些调用的代码
current_user.is_admin?
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我无法弄清楚is_admin?方法的定义.我正在使用Devise,CanCan和role_model,但该方法不在任何这些项目的源代码中,或者在我的...
我还尝试通过在Rails控制台中执行此操作来查找方法的所有者:
current_user.method(:is_admin?).owner
=> #<Module:0x00000105253c98>
Run Code Online (Sandbox Code Playgroud)
但这没什么帮助......
在Ruby中,我如何以编程方式确定哪个类/模块定义了被调用的方法?
在我调用的给定范围内说some_method().在同一范围内,我想调用一个函数find_method(:some_method),将返回其类,单例类或模块定义some_method.
这里有一些代码来说明我的意思:
class Foo
include ...
def bar
...
some_method() # calls a method in scope, assume it exists
find_method(:some_method) # Returns where the method is defined
# e.g. => SomeClassOrModule
...
end
end
Run Code Online (Sandbox Code Playgroud)
我猜我不得不使用的反射功能,从复杂的混合物self,用self.ancestors走了继承树,使用method_defined?检查的方法在类或模块,并且可能是一些其他技巧来检查从范围界定最里面到最外层(因为代码可以在例如a内运行instance_eval).
我只是不知道正确的顺序和Ruby的元模型的所有细微之处来实现find_method,使得它在其搜索既详尽和正确的方法分派分辨率的观点.
谢谢!
我正在学习来自java的ruby dev,我不明白为什么我会得到以下错误.@test是一个类变量,所以我应该能够输出它?
C:/Projects/RubyPlayground/Tester.rb:6:in `test': wrong number of arguments (ArgumentError)
from C:/Projects/RubyPlayground/Tester.rb:6:in `testMethod'
from C:/Projects/RubyPlayground/Tester.rb:10
Run Code Online (Sandbox Code Playgroud)
资源:
class Tester
@test = "here"
def testMethod()
puts test
end
s = Tester.new()
s.testMethod()
end
Run Code Online (Sandbox Code Playgroud)