在Rails中如何require,require_dependency和常量重载?

requirerequire_dependency不同?
如何require_dependency自动重新加载类的开发,但require不能?

我深入Rails的ActiveSupport::Dependencies和dispatcher.rb代码。 我在require_dependency的代码中看到的是它基本上将常量添加到一个autoloaded_constants数组中。 但是在每个请求之后, clear_application在调度clear_application内的clear_application被清除。

有人可以给出一个明确的解释或指向我的一些资源,这将有助于?

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

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

换句话说,这可以让你在文件app/models/admin/user.rb定义class Admin::User并且当你从另一个部分调用Admin::User.new时,Rails知道你在说什么应用程序像控制器。 没有ActiveSupport :: Dependencies涉及你将不得不手动require你需要的一切。

如果你是从静态types的语言,如C#,Java等来的,那么这可能是一个惊喜:Rails代码不加载,直到需要。 例如, User模型类未定义,并且在您尝试调用User.whatever_method_here之后才会加载User.whatever_method_here Rails防止Ruby抱怨缺less的常量,为User加载代码,然后允许Ruby继续正常。

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

在Ruby和Rails的世界中,简单和清晰是关键。 如果你所要做的只是编写一个插件或引擎,而且你已经深入内部,那么你可能会考虑从不同的angular度来处理你的问题。 我的直觉告诉我,你可能正在试图做一些不必要的事情。 但是,再一次,我不知道你在做什么! 🙂

当你想重新打开一个在你的引擎中没有定义的类(例如在另一个引擎或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