如何要求,require_dependency和常量重装Rails中相关?(How are requ

2019-07-18 21:18发布

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

我挖到Rails' ActiveSupport::Dependencies和dispatcher.rb代码。 我在看到require_dependency的代码是主要添加的常量的autoloaded_constants阵列。 但它得到清除clear_application每个请求后内调度。

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

Answer 1:

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的简单和清晰是关键。 如果你想要做的就是写一个插件或引擎,你已经潜水深入到内部,那么你可以考虑从不同的角度接近你的问题。 我的直觉告诉我,你可能会试图做的东西是不必要的复杂。 不过话又说回来,我不知道你在做什么!究竟 :)



Answer 2:

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?