2021 年更新:
由于这个答案是我在 StackOverflow 上最明显的答案,而且它已经很旧了,所以我认为是时候更新它以更深入一些了。它的原始信息并没有错误,但它有点太笼统了,我觉得我可以用我现在所掌握的知识更好地解释它。原答案保留如下。
Rails 与普通 ruby 相比的工作方式是,它基本上需要动态文件,而不需要添加require
s 位于文件顶部。现在官方 Rails 指南上有一个关于它的相对深入的页面here https://guides.rubyonrails.org/v6.1/autoloading_and_reloading_constants_classic_mode.html.
从 Rails 6 开始,他们引入了一个新的加载器来管理自动加载源文件的逻辑,将该工作卸载到名为 gem 的zeitwerk https://github.com/fxn/zeitwerk。有还有 Rails 指南的页面 https://guides.rubyonrails.org/v6.1/autoloading_and_reloading_constants.html这解释了新装载机的工作原理。
基本思想是这样的:
-
Rails 运行一堆配置文件(environment.rb
, application.rb
, boot.rb
, 各自的environments/<environment>.rb
, config/routes.rb
、初始化器等)。在此启动阶段运行的所有文件都位于config
目录,因此如果更改的文件位于config
目录,它probably需要重新启动 Rails。
-
然后 Rails 开始监视每个文件下的所有文件autoload_paths
(默认情况下每个目录app
)来检查它们何时发生变化。它还专门监视config/routes.rb
file.
-
现在有了良好的路由配置,Rails 知道要响应哪些路径以及使用哪些控制器。一旦您点击配置的路线之一,Rails 将运行您的控制器操作。
-
每当 ruby 看到它无法识别的常量时,它就会调用该方法const_missing
。 Rails 重写此方法来获取常量的名称,并使用它在每个目录中搜索具有相同名称的文件。autoload_paths
.
-
当它找到该文件时,它会即时需要该文件,并假设它将定义触发该文件的常量const_missing
,然后代码继续。
-
下次使用相同的常量时,它现在将被定义,因此它甚至不会到达const_missing
method.
-
最后但并非最不重要的一点是,如果配置cache_classes
被设定为false
(开发环境中的默认设置),那么每当 Rails 捕获它正在监视的文件之一的更改时,它就会取消设置与该文件关联的常量(它从文件名中得知)。
因此,每当您需要更改第 1 步中加载的任何内容时,经过特殊处理的内容除外config/routes.rb
,您需要重新启动Rails。除此之外,Rails 将通过该自动加载机制重新加载,除非将其设置为缓存结果。
在生产中,它也默认配置为预加载类,因此它将在启动服务器之前加载所有类。这是为了避免整体的开销const_missing
、文件搜索和动态require
thing.
非 ruby 文件(例如资源和视图)都会在请求时由 Rails 读取,因此您可以随时更改它们而无需重新启动 Rails。 (注:生产环境下的资源通常是预编译的,所以改变里面的资源app/assets
不会导致任何改变。但它仍然在请求时加载,只是有问题的文件是内部的编译包public
目录)。
原答案:
当您需要从头开始重新加载 Rails 时,您需要重新启动服务器。
如果您要添加或删除宝石,那么您将需要重新启动服务器。
如果您更改了 ruby 版本、更改了 Gemfile 或更改了 Rails 内部类中的某些内容,则需要重新启动它,否则应该没问题。但如果出现意外问题,首先应该尝试重新启动服务器。
另外,顺便说一下,如果刷新页面,您只会看到更改config.cache_classes
被设定为false
(我认为这是开发的默认设置,但不是生产的默认设置)。
Edit:
为了确保每个人都会注意到,塔德曼在评论中说了一件明智的事情,这里的一般经验法则是对 app/ 或 config/routes.rb 或 db/ 之外的任何内容进行更改都需要重新启动。