image_path возвращает неверный URL, если вызывается из средства визуализации в задании redis - PullRequest
1 голос
/ 02 мая 2020

Приложение 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)       
    }

1 Ответ

0 голосов
/ 06 мая 2020
  def perform(chat_message)
    # ChatMessagesController.renderer.defaults[:http_host] = ENV['RAILS_APPLICATION_URL'].presence || 'http://localhost:3000' 

    renderer = ChatMessagesController.renderer.new(
      http_host: ENV['RAILS_APPLICATION_URL'].presence || 'http://localhost:3000' ,
      https:      Rails.env.production?
    )

    ActionCable.server.broadcast "stream:#{chat_message.stream.id}", {
        chat_message: renderer.render(chat_message)         
    }

  end

Таким образом, значения по умолчанию по любой причине сбрасываются на example.com во время его работы. Если я создаю рендерер и специально устанавливаю его хост (и ssl), он, кажется, работает нормально. SSL также должен быть установлен правильно, иначе он не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...