49

我注意到,当我更改 rails 项目文件(例如 ahtml.erb.css)时,我不必使用该rails -s命令重新启动服务器。

但我认为当我想安装一个新的 gem 时,我必须这样做。问题是我试图让 jQuery 工作,所以我厌倦了一直这样做rails -s

谁能告诉我当rails -s我修改我的应用程序时我什么时候必须再次运行,我什么时候可以不这样做?不这样做,我的意思是简单地刷新网页以查看更改。

4

3 回答 3

64

2021 年更新:

由于这个答案是我在 StackOverflow 上最明显的答案,而且它已经很老了,我认为是时候更新它以更深入地了解它了。它的原始信息并没有错误,但它有点过于笼统,我觉得我可以用我现在的知识更好地解释它。原始答案保留在下面。

Rails 与普通 ruby​​ 相比的工作方式是,它基本上需要您的文件即时运行,而无需require在文件顶部添加 s。现在在官方 Rails 指南上有一个很好的相对深入的页面

从 Rails 6 开始,他们引入了一个新的加载器来管理自动加载源文件的逻辑,将工作卸载到一个名为zeitwerk的 gem 。Rails 指南上还有一个页面解释了新加载器的工作原理。

基本思想是这样的:

  1. Rails 运行一堆配置文件(environment.rb, application.rb, boot.rb, 各自的environments/<environment>.rb, config/routes.rb, 初始化程序等)。在此启动阶段运行的所有文件都在config目录中,因此如果更改的文件在config目录中,则可能需要重新启动 Rails。

  2. 然后 Rails 开始查看每个文件下的所有文件autoload_paths(默认情况下每个 dir inside app)以检查它们何时发生变化。它还专门监视config/routes.rb文件的更改。

  3. 现在有了一个很好的路由配置,Rails 知道响应哪些路径以及使用哪些控制器。一旦你点击了配置的路线之一,Rails 将运行你的控制器动作。

  4. 每当 ruby​​ 看到一个它无法识别的常量时,它就会调用 method const_missing。Rails 会覆盖此方法以获取常量的名称,并使用它在autoload_paths.

  5. 当它找到该文件时,它会即时要求它,假设它将定义触发 的常量,const_missing然后代码继续运行。

  6. 下次使用相同的常量时,它现在将被定义,因此它甚至不会到达const_missing方法。

  7. 最后但并非最不重要的一点是,如果配置cache_classes设置为false(开发环境中的默认设置),那么每当 Rails 捕获它正在监视的文件之一中的更改时,它将取消设置与文件关联的常量(它从名称中知道文件)。

因此,当您需要更改在该步骤 1 中加载的任何内容时,除了经过特殊处理的 之外config/routes.rb,您需要重新启动 Rails。除此之外,Rails 将通过该自动加载机制重新加载,除非它被设置为缓存结果。

在生产环境中,它还默认配置为预加载类,因此它会在启动服务器之前加载所有类。这是为了避免整体const_missing、文件搜索和动态require事物的开销。

非 ruby​​ 文件,如资产和视图,在请求时都会被 Rails 读取,因此您可以随时更改它们而无需重新启动 Rails。(注意:在生产环境中资产通常是预编译的,所以改变里面的资产app/assets不会导致任何改变。但是在请求时它仍然在加载,只是有问题的文件是public目录内的编译包)。


原答案:

当您需要从头开始再次加载 Rails 时,您需要重新启动服务器。

如果您要添加或删除 gem,那么是的,您需要重新启动服务器。

如果你改变你的 ruby​​ 版本,改变你的 Gemfile 或者从 Rails 的内部类中改变一些东西,你需要重新启动它,否则应该没问题。但是,如果出现意外问题,您应该首先尝试重新启动服务器。

config.cache_classes此外,在旁注中,如果设置为false(我认为这是开发的默认设置,但不是生产的默认设置),您只会看到刷新页面的更改。

编辑:

为了确保每个人都会注意到,tadman 在评论中说了一件明智的事情,这里的一般经验法则是对 app/ 或 config/routes.rb 或 db/ 之外的任何内容进行更改将需要重新启动。

于 2013-07-18T16:55:33.360 回答
19

在开发中,您需要在以下情况下重新启动:

  • 您在Gemfile.
  • 您可能通过rvm.
  • 您更改 下的任何文件config/,但routes.rb会为您重新加载。
  • require手动更改任何文件,而不是自动加载。

在生产中,您需要在以下情况下重新启动:

  • 您更改任何代码或宝石。

注意如果需要,可以通过编辑相应的environment/<env>.rb文件来更改这些行为,尽管默认值是合理的。

于 2013-07-18T17:13:38.233 回答
1

每当安装或更新 gem、升级 ruby​​ 或更改启动期间运行的某些逻辑(如 config/boot.rb 或 config/database.yml)时,通常都需要重新启动服务器。否则,即使您编辑/添加模型/控制器,通常也可以不这样做。

旁注:jquery-rails gem使将 jquery 添加到项目中变得容易。

于 2013-07-18T16:50:38.370 回答