Как я могу предварительно загрузить проблемы в инициализаторе rails, используя Rails 6 / Zeitwerk? - PullRequest
3 голосов
/ 01 июня 2019

Я работаю с инициализатором, который вносит некоторые обезьяны в патчи при запуске приложения, включая некоторые проблемы приложения в стороннюю библиотеку. В основном:

# config/initializers/my_initializer.rb

class SomeExternalLib
  include MyConcern1
  include MyConcern2
end

Это прекрасно работает в Rails 5.2.3, но при обновлении до Rails 6 я получил следующее сообщение об устаревании:

ПРЕДУПРЕЖДЕНИЕ ОБ УСТРАНЕНИИ: Инициализация автоматически загружала константы MyConcern1 и MyConcern2.

Возможность делать это устарела. Автозагрузка во время инициализации идет быть ошибкой в ​​будущих версиях Rails.

Перезагрузка не перезагружает приложение, поэтому код выполняется во время инициализация не запускается снова. Итак, если вы перезагрузите ApplicationHelper, например, ожидаемые изменения не будут отражены в этом устаревшем объекте Module.

Эти автозагрузочные константы были выгружены.

Пожалуйста, ознакомьтесь с руководством "Автозагрузка и перезагрузка констант" для решения. (вызывается из /Users/myuser/code/myapp/config/environment.rb:7)

Мои проблемы находятся в приложении / контроллеры / проблемы /. После некоторого исследования я выяснил, что этот путь не был автоматически загружен, но я не могу понять, как заставить Zeitwerk - новый автозагрузчик Rails 6 - загружать это динамически. Я попытался следовать шаблону автозагрузки STI, описанному здесь , но безуспешно. Любая идея, как обратиться к этому предупреждению об устаревании?

1 Ответ

1 голос
/ 04 июня 2019

Помогло бы, если бы я прочитал сообщение об ошибке немного более внимательно:

Автозагрузка во время инициализации будет являться ошибочным условием в будущих версиях Rails.

Обсуждение изменения: здесь и руководство здесь .

Короче говоря, автозагрузка не должна выполняться в инициализаторах, и это будет прекращено. Решения могут быть: 1) не использовать вещи, которые должны быть автоматически загружены в инициализаторах (предпочтительно, очевидно), или 2) явно требовать зависимости в инициализаторах.

Так я бы сделал:

# config/initializers/my_initializer.rb

require 'my_concern1'
require 'my_concern2'

class SomeExternalLib
  include MyConcern1
  include MyConcern2
end
...