ActiveStorage 5.2.1 - загруженный ресурс равен нулю, поскольку загрузка не завершена. Как дождаться окончания загрузки?

Я использую ActiveStorage для пользовательских таблиц стилей, которые будут загружены на s3, чтобы включить их в пользовательскую веб-страницу в пользовательском стиле.

Итак, у меня есть модель CustomeTheme

has_one_attached :style, dependent: :purge_later

и обратный вызов after_save, который выполняет загрузку после сохранения пользовательского стиля

self.style.attach(io: File.open(File.join(asset_path, name)), filename: name, content_type: 'text/css')

Включено в макет

= stylesheet_link_tag url_for(@custom_theme.style)

Теперь проблема в том, что пользователь сохраняет стиль и видит предварительный просмотр пользовательской веб-страницы, но без пользовательского стиля (404 в данный момент), поскольку загрузка на s3 еще не завершена, по крайней мере, так я полагаю,

to_model delegated to attachment, but attachment is nil

/usr/local/bundle/gems/activesupport-5.2.1/lib/active_support/core_ext/module/delegation.rb:278:in `rescue in method_missing'
/usr/local/bundle/gems/activesupport-5.2.1/lib/active_support/core_ext/module/delegation.rb:274:in `method_missing'
/usr/local/bundle/gems/actionpack-5.2.1/lib/action_dispatch/routing/polymorphic_routes.rb:265:in `handle_model'
/usr/local/bundle/gems/actionpack-5.2.1/lib/action_dispatch/routing/polymorphic_routes.rb:280:in `handle_model_call'
/usr/local/bundle/gems/actionview-5.2.1/lib/action_view/routing_url_for.rb:117:in `url_for'

Таким образом, вопрос остается неясным для меня, как я могу знать, что актив (независимо от того, является ли это стиль или изображение) готов для отображения?

1 ответ

2 возможных подхода:

  1. Определите маршрут для проверок состояния загрузки, а затем запустите интервал в Javascript, чтобы проверить состояние загрузки для данного идентификатора загрузки. Когда он заканчивается, конечная точка возвращает URL ресурса, который затем вы можете использовать. (Например, если актив представляет собой изображение, вы просто помещаете его на <img> тег src атрибуты).

  2. Другим подходом было бы что-то вроде того, что делает Delayed Paperclip:

В настройках по умолчанию, когда вы загружаете изображение в первый раз и пытаетесь отобразить его до завершения задания, Paperclip не будет мудрее и выведет URL изображения, которое еще предстоит обработать, что приведет к битая ссылка на изображение отображается на странице.

Для того чтобы отсутствующий URL-адрес изображения выводился с помощью скрепки во время обработки изображения, все, что вам нужно сделать, - это добавить столбец #{attachment_name}_processing к конкретной модели, для которой вы хотите включить эту функцию.

class AddAvatarProcessingToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :avatar_processing, :boolean
  end

  def self.down
    remove_column :users, :avatar_processing
  end
end

@user = User.new(avatar: File.new(...))
@user.save
@user.avatar.url #=> "/images/original/missing.png"

# Process job

@user.reload
@user.avatar.url #=> "/system/images/3/original/IMG_2772.JPG?1267562148"
Другие вопросы по тегам