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

时间:2019-02-06 19:35:18

标签: ruby-on-rails ruby introspection

红宝石/铁轨新手。在一个大型的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

1 个答案:

答案 0 :(得分:2)

您可以使用以下几项来进行内省和调试:

  • 安装并要求prypry-byebug并将binding.pry放置在代码中的某个位置,将使您可以step / next遍历逻辑,直到获得为止到达您认为需要的地方
  • 使用帖子评论中所述的owner方法。如果您有User模型,则可以例如从控制台类型User.method(:_update_callbacks).owner中查看它是否来自ActiveRecord::Base
  • 您可以使用.source_location方法查看在其中定义了什么文件。例如,从Rails控制台中,我可以键入User.method(:_update_callbacks).source_location并看到该方法在{{ 1}}文件(在响应中注明了完整路径)
  • 如果您知道该模块已包含在内,但无法弄清楚您还可以在本地系统上编辑该gem来打印该模块所在的位置

下面显示了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文件中添加nextbinding.prybundle open <gemname>应该在编辑器中打开实际文件夹,并且只要您在Gemfile中配置了撬/ byebug(如果使用捆绑程序)或通过gem open <gemname>进行安装,应该可以。

step with pry