Rails 5 на Vagrant кеширует классы в режиме разработки - PullRequest
0 голосов
/ 18 июня 2019

Я использую приложение 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 на каждой машине - что по-прежнему выключено, но ониблизко).Не работает.

1 Ответ

0 голосов
/ 18 июня 2019

Нашел ответ в другой теме: https://stackoverflow.com/a/36616931/1512790

Изменения файла не были обнаружены ActiveSupport::EventedFileUpdateChecker, независимо от того, какие изменения я внес в синхронизацию часов, типы файлов и т. Д.

Решение заключается в следующем: в 'config / environment / development.rb' замените эту строку

config.file_watcher = ActiveSupport::EventedFileUpdateChecker

на эту:

config.file_watcher = ActiveSupport::FileUpdateChecker

Класс FileUpdateChecker для любых целейпричина, работает в средах vm, когда EventedFileUpdateChecker этого не делает.

Огромный привет покари для этого решения.

...