首页 > 解决方案 > 如何找到方法的 Rails 模块路径

问题描述

Ruby/rails 新手。在一个大型 Rails 应用程序中,我遇到了一些方法,但找不到它们的文档。例如,有一种方法process。当我自省和检查它的祖先时,我可以去 Rails::Controller::Testing::TemplateAssertions.process但谷歌搜索它并没有给我任何关于如何使用该方法的文档,只是该方法的定义非常模糊。

我想找到的是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

标签: ruby-on-railsrubyintrospection

解决方案


您可以使用以下几件事来帮助进行自省和调试:

  • 安装和要求pry,并在代码中pry-byebug放置一个位置将允许您/通过逻辑,直到您到达您认为需要的位置binding.prystepnext
  • 使用owner您帖子评论中所述的方法。如果您有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

那里可能有更好/更清洁的东西,但这些可能有用。

根据我在下面的评论,有关使用 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

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

一步与撬


推荐阅读