Я использую приложение Rails 5 на виртуальной машине Vagrant.Я сгенерировал только один каркас под названием Blog, и он работает.
Любые изменения классов, выполняемые вручную, однако для вступления в силу требуют перезапуска сервера Rails, несмотря на то, что он находится в режиме разработки.
Редактировать: я опубликовал ответ на этот вопрос, который сработал для меня, после того, как я попробовал множество других ошибочных решений, для тех, кто хочет пропустить вперед ...
Все файлы блогов были успешно созданы, я могу просматривать страницы, используя индекс, редактировать и т. Д. Маршруты.Но если я изменю @blogs = Blog.all
в методе index в BlogsController
на @blogs = Blog.limit(1)
и обновлю браузер, представление не изменится.Все сообщения в блоге все еще перечислены.
Я посмотрел в своем локальном каталоге и тот, что на виртуальной машине.Они совпадают.Итак, изменения на сервере.
Я закрыл и перезапустил сервер Rails с @blogs = Blog.limit(1)
в качестве содержимого метода индекса, и страница загружается, как и ожидалось, с появлением одного сообщения в блоге.
Как мне заставить приложение railsотображать обновленный контент без перезагрузки сервера?Есть ли какое-то кэширование по умолчанию, которое я могу отключить?Я использую RubyMine в качестве своей IDE, но у меня нет настроек развертывания, и я не включил никакого специального кэширования.Я использовал RubyMine и Vagrant в другом проекте Rails (под управлением Ruby 2.0.0 и Rails 4.1.4) без этой проблемы.
Версия 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', и в браузере показывается 'development'.Таким образом, среда приложения настроена правильно, но она все еще кэширует классы (или что-то в этом роде).Есть ли что-то в Rails 5, где он по умолчанию рассматривает vm как удаленный (рабочий) сервер, даже если он отображает «development» как переменную 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 / environment / development.rb', 'config / environment / test.rb', и 'config / Environment /production.rb 'Я установил эти атрибуты:
config.cache_classes = false
config.action_controller.perform_caching = false
и перезапустил сервер rails.Без эффекта.
Я перешел на Ruby версии 2.6.3p62 с 2.4.1p111.Без эффекта.
Я закрыл RubyMine и отредактировал blogs_controller.rb в SublimeText.Без эффекта.
Я отредактировал app / views / blogs / index.html.erb и обновил окно браузера, не перезагружая сервер, и изменения в представлении отражаются немедленно.Так что проблема не в кэшировании всего .
В мой Vagrantfile добавлено следующее для ужесточения настроек синхронизации часов гостя и хоста, а такжеповышенный бродяга:
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 и все другие драгоценные камни.Без эффекта.
- В 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]
Безрезультатно.
Это похоже на похожую проблему,где операционная система использует Docker в Mac OS X: Dockerized Rails 5 Приложение RC1 не собирает обновления для контроллеров и моделей в разработке , но я не использую никакого специального развертывания или подготовки, просто Vagrant vm.
Это еще одна похожая проблема, но параметр конфигурации в принятом ответе не существует в Rails 5: Сервер Rails нужно перезапускать каждый раз, когда я делаю изменения?почему? .В одном из комментариев упоминается старая проблема, из-за которой несогласованные часы гостя и хоста Vagrant могли привести к перегрузке Rails.Собираюсь исследовать эту возможность. Редактировать: Подправлены настройки синхронизации часов VirtualBox, подтверждено, что часы на госте и хосте были синхронизированы (они работают в течение 3 секунд, когда я запускаю date
на каждой машине - что по-прежнему выключено, но ониблизко).Не работает.