ruby-on-rails - Rails 中 require、require_dependency 和常量重载有何关系?

标签 ruby-on-rails require

requirerequire_dependency 有何不同?
require_dependency 如何在开发中自动重新加载类,而 require 却不能?

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

有人可以给出明确的解释或向我指出一些有帮助的资源吗?

最佳答案

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

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

换句话说,这可以让您在文件 app/models/admin/user.rb 中定义 class Admin::User 并让 Rails 知道您要做什么正在讨论当您从应用程序的另一部分(例如 Controller )调用 Admin::User.new 时。如果没有涉及 ActiveSupport::Dependations,您将必须手动require您需要的一切。

如果您使用的是 C#、Java 等静态类型语言,那么这可能会令人惊讶:Rails 代码在需要时才会加载。例如,在您尝试调用 User.whatever_method_here 之前,不会定义 User 模型类,并且不会加载 user.rb。 Rails 防止 Ruby 提示缺少常量,为 User 加载代码,然后允许 Ruby 继续正常运行。

虽然我无法满足您的具体需求,但如果您确实需要在插件或引擎中使用 require_dependency 方法,我会感到非常惊讶。如果您遵循 Rails 约定,您也不必手动调整 $LOAD_PATH。这不是“Rails 方式”。

在 Ruby 和 Rails 的世界中,简单性和清晰度是关键。如果您只想编写一个插件或引擎,并且您已经深入了解内部结构,那么您可以考虑从不同的角度解决您的问题。我的直觉告诉我,你可能正在尝试做一些不必要的复杂事情。但话又说回来,我不知道你到底在做什么! :)

关于ruby-on-rails - Rails 中 require、require_dependency 和常量重载有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457241/

相关文章:

ruby 需要相关文件

ruby-on-rails - Rails 3中缺少脚本/生成

ruby-on-rails - 将 Ruby on Rails 安装到 Synology DSM 5.2 时出现问题

ruby-on-rails - 使用 Devise 和 Rails 从 Twitter Oauth 取回电子邮件

mongodb - 引用错误 : require is not defined in MongoDB shell

php - 为什么找不到我的界面?

javascript - 使用 Webpack 基于环境的条件构建

ruby-on-rails - 如何编写 bash 脚本以在 Rails 控制台中运行命令

ruby-on-rails - 将 public_activity 与 acts_as_follower 和设计一起使用,我怎样才能只显示用户的事件和他关注的人的事件?

vb.net - FxCop 或其他实用程序需要 VB.NET 中的内联文档?