ruby-on-rails - 如何找到方法的 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
解决方案
您可以使用以下几件事来帮助进行自省和调试:
- 安装和要求
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
并查看该方法是在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
,它应该可以工作。
推荐阅读
- xcode - Xcode 服务器:xcscontrol 命令总是失败
- javascript - 查找矩形的未使用空间
- .net-core - .Net 或 .Net Core 中是否有等效的 Spring Cloud Stream?
- c++ - Protobuf:了解 proto 文件的编译输出
- javascript - 不能在父级的 [ngClass] 逻辑中使用子级输入值
- ruby-on-rails - rails capistrano deploy 成功,但我无法访问我的部署 rails 主页
- c# - C# LibreOffice 进程不等待退出
- bash - 为什么 pkill 没有杀死命令 python blink_led.py&
- r - 如何重命名数据框中的单个列
- c# - 试图让玩家旋转垂直于模型的网格。统一