如何require
和require_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的类加载过程的法宝是的ActiveSupport ::依赖模块中。 此代码扩展了默认行为的Ruby允许您的Rails应用程序内的代码来自动加载模块(包括从模块继承的类),使用Rails的路径和文件命名约定。 这消除了程序员需要他们的垃圾代码require
像你会在一个普通的Ruby应用程序的调用。
换一种方式,这可以让你定义class Admin::User
在文件中app/models/admin/user.rb
并有导轨知道你在说,当你调用什么Admin::User.new
从另一部分应用等的控制器。 如果不参与的ActiveSupport ::依赖你将不得不手动require
你所需要的一切。
如果你是从如C#,Java的,等静态类型语言来那么这可能是一个惊喜:Rails代码未加载直到需要它。 例如, User
模型类没有定义,并且user.rb
不加载后,才试图调用User.whatever_method_here
。 导轨防止红宝石从抱怨对于缺少恒定,负载码User
,然后允许Ruby来继续正常。
虽然我不能为您的具体需要说话,如果你确实需要使用我会感到非常惊讶require_dependency
从插件或发动机内的方法。 如果你遵循Rails的惯例,你不应该调整用手$ LOAD_PATH,无论是。 这不是“Rails的方式。”
在Ruby的世界,也Rails的简单和清晰是关键。 如果你想要做的就是写一个插件或引擎,你已经潜水深入到内部,那么你可以考虑从不同的角度接近你的问题。 我的直觉告诉我,你可能会试图做的东西是不必要的复杂。 不过话又说回来,我不知道你在做什么!究竟 :)
require_dependency
当你想重新打开一个未在你的引擎(在另一个引擎或Rails应用程序为例)中定义的类,并把它重新加载在发动机有用。 在这种情况下,像这样的工作:
# 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
文章来源: How are require, require_dependency and constants reloading related in Rails?