Как правильно рендерить изображения через потоки 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-адреса изображений содержат хост-ресурс.ActiveStorage
URL-адреса используют текущий хост по умолчанию (конечно, не хост ресурсов), потому что они на самом деле являются маршрутами перенаправления, а не фактическими файлами. я бы предположил, еслиasset_host
не установлен, то пути к изображениям будут относительными, а не абсолютными? Было бы идеально, если бы они могли просто оставаться относительными независимо от того.