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

Я использую 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 Ответ

0 голосов
/ 19 ноября 2018

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

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

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

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

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

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"
...