Как правильно рендерить изображения через потоки Hotwire Turbo?

Моя проблема: при рендеринге изображений с использованием Hotwire / Turbo все URL-адреса отображаются с хостом, а не с моим фактическим именем хоста. Обычные представления - это нормально, но рендеринг частичных изображений через поток Turbo приводит к URL-адресам ActiveStorage, например http://example.org/.../.

Контекст: у меня есть простое приложение Todo с рабочим представлением, частичным и турбо-потоком, которые вместе показывают Todo и список связанных пользователей. Когда я присоединяюсь к пользователю Todo, турбо-поток отображает правильный фрагмент и помещает имя и аватар пользователя в DOM, где я хочу. Однако URL-адрес изображения из ActiveStorage содержит example.org имя хоста.

Я установил свои стандартные параметры URL в config/environments/*.rb, в том числе routes.default_url_options[:host], а также config.action_mailer.default_url_options[:host]. Я также узнал о файле config/initializers/application_controller_renderer.rb, где вы можете установить параметр; однако я установил http_host, то https логическое значение, и все еще Turbo отображает мой image_tag с example.org.

Кроме того, я нашел ограниченный совет о том, как программно управлять средством визуализации по умолчанию (для решения проблемы). Этот источник говорит, что нужно хватать ApplicationController.renderer и переопределите свойства, например:

      renderer = ApplicationController.renderer.new(
  http_host: request.host_with_port,
  https: (request.protocol == "https://"),
  "rack.session": request.session
)

но broadcast_action_to методы, похоже, не принимают renderer параметр, так что это мне не помогает в Turbo.

Должна быть конфигурация, которую мне не хватает, но я не нахожу ее в документации Turbo или Hotwire.

2 ответа

Решение

Я скучал config.action_controller.default_url_options. Как только я настроил это так же, как другие default_url_options, мои ссылки начали правильно отображаться.

В моем случае у меня есть динамикаdefault_url_optionsпоскольку мое приложение является многопользовательским, поэтому я добавил это вApplicationController:

      def default_url_options
  { host: SiteSetting[:entity].domains.first.name, protocol: 'https' }
end

Я думаю, что все это происходит из-за наличия конфигурации, так что обычно URL-адреса изображений содержат хост-ресурс.ActiveStorageURL-адреса используют текущий хост по умолчанию (конечно, не хост ресурсов), потому что они на самом деле являются маршрутами перенаправления, а не фактическими файлами. я бы предположил, еслиasset_hostне установлен, то пути к изображениям будут относительными, а не абсолютными? Было бы идеально, если бы они могли просто оставаться относительными независимо от того.

Другие вопросы по тегам