如何找到方法的 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
您可以使用一些东西来帮助自省和调试:
- 安装并要求
pry
、pry-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.pry
。 bundle open <gemname>
或 gem open <gemname>
应在您的编辑器中打开实际文件夹,只要您在 Gemfile 中配置了 pry/byebug(如果使用捆绑器)或通过 gem
安装, 它应该工作。
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
您可以使用一些东西来帮助自省和调试:
- 安装并要求
pry
、pry-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.pry
。 bundle open <gemname>
或 gem open <gemname>
应在您的编辑器中打开实际文件夹,只要您在 Gemfile 中配置了 pry/byebug(如果使用捆绑器)或通过 gem
安装, 它应该工作。