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

但我认为,当我想安装一个新的Ruby ,我必须.问题是我正在努力让jQuery工作,所以我厌倦了一直做rails -s.

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

推荐答案

2021更新:

因为这个答案是我在StackOverflow上最明显的答案,而且它已经很旧了,所以我认为是时候更新它,让它更深入一点了.它的原始信息是正确的,但它有点太笼统了,我觉得我可以更好地解释它与我现在的知识.原始答案保存在下面.

Rails与plain ruby相比的工作方式是,它基本上需要您的文件处于动态状态,而无需在文件顶部添加require.如今,官方的Rails guides here上有一个关于它的相对深入的页面.

从Rails 6开始,他们引入了一个新的加载程序来管理自动加载源文件的逻辑,并将其卸载到一个名为zeitwerk的gem.这里有also a page on the Rails guides条解释了新加载器的工作原理.

基本思想是这样的:

  1. Rails运行一系列配置文件(environment.rbapplication.rbboot.rb、相应的environments/<environment>.rbconfig/routes.rb、初始值设定项等).在这个开始阶段运行的所有文件都在config目录中,因此,如果更改的文件在config目录中,它将需要重新启动Rails.

  2. 然后,Rails开始监视每个目录下的所有文件(默认情况下,app中的每个目录),以判断它们是否发生了更改.它还专门监视config/routes.rb文件的更改.

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

  4. 每当ruby看到一个它无法识别的常量时,它就会调用方法const_missing.Rails重写此方法以获取常量的名称,并使用它在autoload_paths的每个目录中搜索具有相同名称的文件.

  5. 当它找到文件时,它会动态地要求它,并假设它将定义触发const_missing的常数,然后代码继续.

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

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

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

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

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


Original answer:

当需要从一开始就重新加载Rails时,需要重新启动服务器.

如果要添加或删除gem,则需要重新启动服务器.

如果您更改了ruby的版本,更改了Gemfile,或者更改了Rails内部类中的某些内容,则需要重新启动它,否则应该可以.但是,如果出现意外问题,首先应该try 重启服务器.

另外,顺便说一句,如果将config.cache_classes设置为false(我认为这是开发的默认值,但不是生产的默认值),您只会看到在刷新页面时所做的更改.

编辑:

为了确保每个人都会注意到,塔德曼在 comments 中说了一件明智的事情,The general rule of thumb here is making changes to anything outside of app/ or config/routes.rb or db/ will require a restart.

Ruby-on-rails相关问答推荐

如何测试自定义路由?

如何在_serialize之前执行代码?""或者如何在序列化属性之前对属性进行清理?

Rails 7.1.3如何在生产环境中查看堆栈跟踪

如何在rails 7中禁用Simple_Form验证

为什么这个rails Collection_select不呈现关联属性?

RubyOnRail在测试环境中启动失败

Rails 7.1,登录到STDOUT和LOG/Production.log

如何使用 Rails 语义记录器记录整个请求(标头、正文等)

NameError:未定义的局部变量或方法记录器

有没有办法在 Rails 3.1 中检测用户代理

mongoid 中 embeds_many 和 has_many 的区别

RubyMine - 关闭在空行中间单击的功能

表单中的第一个参数不能包含 nil 或为空 - Rails 4

您将 Rack 中间件文件和要求放在哪里?

为什么 Google Oauth 在我的 Rails 应用程序中返回无效的 redirect_urI?

资源和资源方法之间的区别

设计:为什么我的注销链接不起作用?

扩展 Devise SessionsController 以使用 JSON 进行身份验证

使用 Rspec 测试关联的正确方法?

我如何为 Rails3/Bundler 供应 gems