require
(及其表亲load
)是Ruby的核心方法。require_dependency
是一种帮助Rails处理依赖关系管理问题的方法。长话短说,它允许Rails在开发模式下重新加载类,这样您就不必在每次更改代码时都重新启动服务器。Rails框架将使用require_dependency
您的代码,以便在进行更改时可以跟踪并重新加载它。标准的Rubyrequire
不会这样做。作为应用程序(或插件/引擎)开发人员,您不必担心,require_dependency
因为这完全是Rails的内部功能。
Rails类加载过程的神奇之处在于ActiveSupport :: Dependencies模块。此代码扩展了默认的Ruby行为,以允许Rails应用程序内的代码使用Rails的路径和文件命名约定自动加载模块(包括从Module继承的类)。这样一来,程序员无需require
像在普通Ruby应用程序中那样通过调用来填充代码。
换句话说,这使您可以class Admin::User
在文件内部进行定义,app/models/admin/user.rb
并使Rails在Admin::User.new
从应用程序的另一部分(如控制器)调用时知道您在说什么。没有ActiveSupport :: Dependencies,您将必须手动完成require
所需的一切。
如果您来自诸如C#,Java等静态类型的语言,那么这可能会令人惊讶:Rails代码直到需要时才加载。例如,在您尝试调用之后,User
才定义模型类,user.rb
并且不会加载模型类User.whatever_method_here
。Rails防止Ruby抱怨缺少常量,为加载代码User
,然后允许Ruby继续正常运行。
虽然我不能满足您的特定需求,但是如果您实际上需要require_dependency
从插件或引擎中使用该方法,我会感到非常惊讶。如果您遵循Rails约定,则也不必手动调整$ LOAD_PATH。这不是“ Rails方式”。
在Ruby和Rails的世界中,简单和清晰是关键。如果您要做的只是编写一个插件或引擎,而您已经深入研究内部结构,那么您可以考虑从另一个角度解决问题。我的直觉告诉我,您可能正在尝试做一些不必要的复杂工作。但是话又说回来,我不知道你到底在做什么!:)