如何在 Rails 中重新加载相关的请求、请求_依赖和常量?

requirerequire_dependency有什么不同?
为什么在开发中 require_dependency可以自动重载类而 require不能?

我深入研究了 Rails 的 ActiveSupport::Dependencies和 patter.rb 代码。我在 require_dependency的代码中看到的是,它基本上是将常量添加到 autoloaded_constants数组中。但是在每次请求后,它在 clear_application内部调度程序中被清除。

有没有人能给我一个清楚的解释或者给我一些有用的资源?

27671 次浏览

require(及其近亲 load)是核心 Ruby 方法。require_dependency是一种帮助 Rails 处理依赖管理问题的方法。长话短说,它允许 Rails 在开发模式下重新加载类,这样每次修改代码时就不必重新启动服务器。Rails 框架将 require_dependency您的代码,以便它可以跟踪和重新加载它时,所做的更改。标准的 Ruby require不会这样做。作为一个应用程序(或插件/引擎)开发人员,你不必担心 require_dependency,因为它纯粹是 Rails 内部的。

Rails 类加载过程的神奇之处在于 ActiveSupport: : Dependency 模块。这段代码扩展了默认的 Ruby 行为,允许 Rails 应用程序中的代码使用 Rails 的路径和文件命名约定自动加载模块(包括从 Module 继承的类)。这就消除了程序员在代码中使用 require调用的需要,就像在一个普通的 Ruby 应用程序中一样。

换句话说,这使您可以在文件 app/models/admin/user.rb中定义 class Admin::User,并且当您从应用程序的另一部分(如控制器)调用 Admin::User.new时,Rails 知道您在讨论什么。如果没有 ActiveSupport: : Dependency 的参与,您将不得不手动 require所有您需要的东西。

如果你使用的是静态类型的语言,比如 C # ,Java 等等,那么这可能会让你大吃一惊: Rails 代码只有在需要的时候才会被加载。例如,没有定义 User模型类,而且在尝试调用 User.whatever_method_here之后才加载 user.rb。Rails 防止 Ruby 抱怨丢失的常量,加载 User的代码,然后允许 Ruby 继续正常运行。

虽然我不能说你的具体需要,我会非常惊讶,如果你实际上需要从一个插件或引擎内使用 require_dependency方法。如果遵循 Rails 约定,也不必手动调整 $LOAD _ PATH。这不是“ Rails 的方式”。

在 Ruby 和 Rails 的世界里,简单和清晰是关键。如果你想做的只是编写一个插件或引擎,而你已经深入到内部,那么你可以考虑从一个不同的角度来处理你的问题。我的直觉告诉我你可能想做一些不必要的复杂的事情。但话说回来,我完全不知道你在做什么! !:)

当你想重新打开引擎中没有定义的类(例如在其他引擎或 Rails 应用程序中)并重新加载它时,require_dependency在引擎中非常有用。在这种情况下,这种方法是有效的:

# app/controllers/my_engine/documents_controller.rb
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s


module MyEngine
class DocumentsController
def show
render :text => 'different'
end
end
end