【问题标题】:Rails caching my code after upgrading to Ruby 2.0 on Mac OS X Mountain Lion在 Mac OS X Mountain Lion 上升级到 Ruby 2.0 后 Rails 缓存我的代码
【发布时间】:2013-06-15 02:11:49
【问题描述】:

在 Mac OS X Mountain Lion 10.8.4 上从 Ruby 1.8.7 升级到 Ruby 2.0 后,Rails 3.2.13 在开发模式下缓存我的帮助模块、控制器和其他 ruby​​ 代码

即使在 Rails 控制台中,我每次都重新启动服务器后才会获取代码更改。重装!控制台中的命令也不起作用,并且在我再次重新启动 rails 控制台之前不会重新加载我的代码更改。

Javascript 和 Sass 文件不会被缓存,但视图、控制器和其他 ruby​​ 代码会被缓存。我检查了 development.rb 文件,以下缓存设置为 false。

config.cache_classes = false

当启动服务器时,它会在控制台日志中看到的开发模式下启动

Rails 3.2.13 application starting in development on http://0.0.0.0:3000

不确定发生了什么,但出于测试目的,我确实更改了系统的时区和时间,并将时间恢复为实际时间。

在使用正确的时间和时区重新启动我的机器后,我什至将 repo 再次克隆到我的系统上,但仍然存在问题。有谁知道如何解决这个问题,或者每次在开发模式下发出请求时如何强制重新加载所有 ruby​​ 代码?

【问题讨论】:

标签: ruby-on-rails ruby caching ruby-on-rails-3.2 code-caching


【解决方案1】:

如果您最近还从旧版 Rails 升级。如果是这种情况,请注意 libnot autoloaded in Rails 3。您正在谈论仍应自动加载的辅助模块和控制器,但 lib 不会。您可以将其更改为自动加载为noted in this answer,添加另一个自动加载的目录,或将这些类移动到现有的自动加载目录(例如app/models,如果合适的话)。

如果您在config.autoload_once_paths 中配置了内容,那么重新加载这些内容可能会出现问题,否则应根据guide 的每个请求重新加载它们(如果您好奇,可以查看代码here关于发生了什么)。

此外,请检查以确保您确实在开发模式下运行,并注意您不能根据 answer 在 development.rb 中将 lib 添加到 config.eager_load_paths

如果您对代码有时间问题,也可能在您重新克隆 repo 时,您仍然会得到错误的文件日期。尝试这样做:find /path/to/rails/app -exec touch {} \; 更新文件 mod 日期时间。 (顺便说一句,您可能希望确保数据库中 created_at/updated_at 中的日期时间正常。希望这不是问题,因为这可能是一团糟。)

最后,确保自动加载目录下的类与它们所在的模块相对应。例如,Foo::BarsController 可以在app\controllers\foo\bars_controller.rb 中,但如果你希望它能够在app\controllers\bars_controller.rb 中则不能自动加载并正确重新加载。

【讨论】:

  • 所以代码不在 lib 文件夹中。此外,它仅发生在某些文件而不是全部文件中。我知道一个控制器不会重新加载代码,但另一个控制器会重新加载,它们都在同一个控制器文件夹中。我也试过 find /path/to/rails/app -exec touch {} \;但代码仍然没有更新。我不得不重新启动服务器。
  • Be absolutely sure 自动加载的所有代码(即使它仅被控制器引用)都位于与自动加载目录下的模块/命名空间相对应的路径中,并且所有这些代码正在自动加载。
猜你喜欢
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2013-02-12
  • 1970-01-01
  • 2014-09-03
  • 2012-08-02
  • 2011-12-08
相关资源
最近更新 更多