如何找到方法的 Rails 模块路径

How do I find the Rails module path for a method

ruby/rails 的新手。在大型 Rails 应用程序中,我遇到了一些方法,但找不到它们的文档。比如有一个方法process。当我反省和检查它的祖先时,我可以找到 Rails::Controller::Testing::TemplateAssertions.process 但谷歌搜索没有给我任何关于如何使用该方法的文档,只有 method's definition 非常晦涩。

我想找到的是 ActionDispatch::Integration::Session.process,然后我可以在 https://api.rubyonrails.org/ 中查找它并获得有关如何使用该方法的详细文档。我想我找不到这个 "original" 模块路径是因为 Rails 使用了 mixins。我找到它的唯一方法是在我发现它在某些评论中提到之前筛选 rails 存储库的文件和文件。所以我的问题是,有没有更确定的方法来找到方法的起源?

编辑:这段代码的上下文看起来有点像这样:

require 'test_helper'
class C < ActionDispatch::IntegrationTest
   include OtherHelper
   ...
   process(argA,argB,argC)
end

您可以使用一些东西来帮助自省和调试:

  • 安装并要求 prypry-byebug 并在代码中的某处放置 binding.pry 将允许您 step/next 通过逻辑直到你到达你认为你需要去的地方
  • 使用 owner 方法,如对 post 的评论中所述。如果你有一个 User 模型,你可以,例如,从控制台类型 User.method(:_update_callbacks).owner 并看到它来自 ActiveRecord::Base
  • 您可以使用 .source_location 方法查看在哪个文件中定义了某些内容。例如,从 rails 控制台我可以键入 User.method(:_update_callbacks).source_location 并查看该方法定义在active_support/callbacks.rb 文件的第 819 行(响应中注明了完整路径)
  • 如果您知道该模块被包含在内,但无法确定您还可以在本地系统上编辑 gem 以打印它被包含在何处

下面打印出Bar

module Foo
  def self.included(base)
    puts "including..."
    puts base
    puts "included..."
  end
end

class Bar
  include Foo
end

那里可能有一些东西 better/cleaner 但这些可能有用。

关于使用 pry 的更多详细信息,根据我在下面的评论:

鉴于我已经 运行 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

当您在 super 之前点击 binding.pry 时,您可以调用 next,这将带您进入新文件,您可以在其中看到文件名和行号。您需要在计算机上的实际 gem 文件中添加 binding.prybundle open <gemname>gem open <gemname> 应在您的编辑器中打开实际文件夹,只要您在 Gemfile 中配置了 pry/byebug(如果使用捆绑器)或通过 gem 安装, 它应该工作。