Приложение Rails 6 с ActiveStorage имеет помощник приложения, который возвращает изображение профиля пользователя.
module ApplicationHelper
def profile_picture_with_class user, css_class, shape, width = 100
if (shape == :square)
placeholder_pic = "blank_profile_square.jpg"
else
placeholder_pic = "blank_profile_round.png"
end
image_path = user.profile_image.present? ? user.profile_image : placeholder_pic
image_tag(image_path, width: width, class: css_class)
end
end
Когда этот applicationHelper вызывается из приложения, он работает нормально. Однако, если задание redis использует этот applicationHelper, возвращаемый image_tag собирается вместо фактического хоста моих приложений (localhost: 3000 в dev), и это создает очень испорченную ссылку.
Я предполагаю, что это происходит внутри задания redis он не знает, что такое хост, поэтому он ожидает чего-то другого. Как понять, как использовать правильный хост и тип активного хранилища (диск или блоб)
Спасибо.
Сравнение двух созданных ссылок:
Пример:
Redis возвращает это:
http://example.org/rails/active_storage/blobs/<big_long_chunk>/new-chimney-crown.jpg
При запуске в представлении возвращает это:
http://localhost:3000/rails/active_storage/disk/<big_long_chunk>/new-chimney-crown.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22new-chimney-crown.jpg%22%3B+filename%2A%3DUTF-8%27%27new-chimney-crown.jpg
Редактировать: Я почти уверен, что это как-то связано с это: https://evilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions
Это задание redis, я считаю, что когда image_path вызывается из ChatMessagesController.render, он не понимает текущий хост.
def perform(chat_message)
ActionCable.server.broadcast "stream:#{chat_message.stream.id}", {
chat_message: ChatMessagesController.render(chat_message)
}