红宝石/铁轨新手。在一个大型的Rails应用程序中,我遇到了很多方法,但是找不到它们的文档。例如,有一个方法process
。当我进行内部检查并检查其祖先时,可以进入Rails::Controller::Testing::TemplateAssertions.process
,但是使用Google搜索时并没有提供有关如何使用该方法的任何文档,只是method's definition这是非常晦涩的。
我想找到的是ActionDispatch::Integration::Session.process
,然后可以在https://api.rubyonrails.org/中查找并获得有关如何使用该方法的详细文档。我认为由于Rails使用mixins,很难找到此“原始”模块路径。我发现它的唯一方法是,在我发现它在某些注释中提到之前,先浏览一下Rails存储库中的文件和文件。所以我的问题是,是否有确定性的方法可以找到方法的起源?
编辑:这段代码的上下文看起来像这样:
require 'test_helper'
class C < ActionDispatch::IntegrationTest
include OtherHelper
...
process(argA,argB,argC)
end
答案 0 :(得分:2)
您可以使用以下几项来进行内省和调试:
pry
,pry-byebug
并将binding.pry
放置在代码中的某个位置,将使您可以step
/ next
遍历逻辑,直到获得为止到达您认为需要的地方owner
方法。如果您有User
模型,则可以例如从控制台类型User.method(:_update_callbacks).owner
中查看它是否来自ActiveRecord::Base
.source_location
方法查看在其中定义了什么文件。例如,从Rails控制台中,我可以键入User.method(:_update_callbacks).source_location
并看到该方法在{{ 1}}文件(在响应中注明了完整路径)下面显示了active_support/callbacks.rb
Bar
那里可能有更好/更清洁的东西,但它们可能有用。
根据以下我的评论,有关使用撬动的更多详细信息:
鉴于我已经运行module Foo
def self.included(base)
puts "including..."
puts base
puts "included..."
end
end
class Bar
include Foo
end
,并具有以下代码示例:
gem install pry pry-byebug
在require 'pry'
require 'pry-byebug'
module Foo
def blah
puts "in Foo"
end
end
class Bar
include Foo
def blah
binding.pry
super
puts "in Bar"
end
end
x = Bar.new
x.blah
之前,点击binding.pry
时,您可以调用super
,这将带您进入新文件,在其中可以看到文件名和行号。您需要在计算机上的实际gem文件中添加next
。 binding.pry
或bundle open <gemname>
应该在编辑器中打开实际文件夹,并且只要您在Gemfile中配置了撬/ byebug(如果使用捆绑程序)或通过gem open <gemname>
进行安装,应该可以。