【发布时间】:2019-10-31 15:09:29
【问题描述】:
我正在 Vagrant 虚拟机上运行一个简单的 Rails 5 应用程序。我只生成了一个名为 Blog 的脚手架,它正在工作。
然而,对类的任何手动更改都需要重启 Rails 服务器才能生效,尽管处于开发模式。
编辑:在尝试了许多其他有缺陷的解决方案之后,我已经发布了一个对我有用的答案,对于那些想要跳过的人......
Blog脚手架文件全部创建成功,可以使用索引、编辑等路由查看页面。但是如果我将BlogsController中的索引方法中的@blogs = Blog.all更改为@blogs = Blog.limit(1)并刷新浏览器,视图不会改变。仍然列出所有博客文章。
我查看了本地目录和 vm 上的目录。他们匹配。所以更改在服务器上。
我关闭并重新启动了以@blogs = Blog.limit(1) 作为索引方法内容的Rails 服务器,页面按预期加载,出现了一篇博文。
如何在不重新启动服务器的情况下让 rails 应用程序显示更新的内容?默认情况下是否有一些缓存可以关闭?我使用 RubyMine 作为我的 IDE,但我没有部署设置,也没有打开任何特殊缓存。我在另一个 Rails 项目(运行 Ruby 2.0.0 和 Rails 4.1.4)上使用了 RubyMine 和 Vagrant,没有这个问题。
Rails 版本 5.2.3
Ruby 版本 2.4.1p111 或 2.6.3p62(均无效)
RubyMine 2019.1 版
Vagrant 正在使用 VirtualBox 并运行 Ubuntu 18.04.2 LTS
根据其他帖子,这是生产环境的默认行为。我在命令行上尝试了echo $RAILS_ENV,但返回null。
我将<%= Rails.env %> 添加到“...blogs/index.html.erb”,它在浏览器中显示“开发”。所以应用程序环境设置正确,但它仍在缓存类(或其他东西)。 Rails 5 有什么地方默认将 vm 视为远程(生产)服务器,即使它显示为 Rails.env 变量的“开发”?
这是启动 rails 服务器后的相关控制台输出:
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.4.1-p111), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
我尝试过的事情:
我已清除浏览器缓存并运行
rake tmp:cache:clear。不 效果。在文件 'config/environments/development.rb' 中, 'config/environments/test.rb',和 'config/environments/production.rb' 我设置了这些属性:
config.cache_classes = false
config.action_controller.perform_caching = false
并重新启动 rails 服务器。没有效果。
我已从 2.4.1p111 切换到 Ruby 版本 2.6.3p62。没有效果。
我关闭了 RubyMine 并在 SublimeText 中编辑了“blogs_controller.rb”。不 效果。
我编辑了“app/views/blogs/index.html.erb”并刷新了浏览器 窗口而无需重新启动服务器,并且对视图的更改是 立即反映。所以这不是缓存所有内容的问题。
在我的 Vagrantfile 中添加了以下内容,以加强同步访客和主机时钟的设置,并重新升级 vagrant:
config.vm.provider 'virtualbox' do |v|
v.customize ["guestproperty", "set", :id, "--timesync-set-threshold", 5000] # Sync time every 5 seconds so Rails code reloads properly
v.customize ["guestproperty", "set", :id, "--timesync-interval", 10000] # Specifies interval at which to synchronize time with the host. Default is 10000ms (10 seconds).
v.customize ["guestproperty", "set", :id, "--timesync-min-adjust", 100] # The minimum absolute drift value measured in milliseconds to make adjustments for. The default is 1000 ms on OS/2 and 100 ms elsewhere.
v.customize ["guestproperty", "set", :id, "--timesync-set-on-restore", 1] # Set the time after the VM was restored from a saved state when passing 1 as parameter. This is the default.
end
没有效果。
- 重新安装了 Ruby、Rails 和所有其他 gem。没有效果。
- 在 Vagrantfile 中,更改了 vagrant 正在使用的同步文件夹的文件类型并设置了 dhcp 专用网络连接:
config.vm.network "private_network", type: "dhcp"
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['actimeo=1']
没有效果。
- 在 Vagrantfile 中,确保客户机正在获取主机时钟数据:
v.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
没有效果。
这似乎是一个类似的问题,op 在 Mac OS X 上使用 Docker:Dockerized Rails 5 RC1 application not picking up updates to controllers and models in development,但我没有使用任何特殊的部署或配置,只是一个 Vagrant vm。
这是另一个类似的问题,但 Rails 5 中不存在已接受答案中的配置设置:Rails Server needs restart every time I make changes? why?。其中一个 cmets 提到了一个老问题,即 Vagrant 来宾和主机时钟不同步可能会破坏 Rails 的重新加载。要去调查这种可能性。 编辑:调整了 VirtualBox 时钟同步设置,确认来宾和主机上的时钟是同步的(当我在每台机器上运行 date 时它们在 3 秒内 - 这似乎仍然关闭,但它们是关闭)。没用。
【问题讨论】:
标签: ruby-on-rails ruby vagrant ruby-on-rails-5