Carrierwave не воссоздает версии после обновления модели - PullRequest
0 голосов
/ 17 февраля 2019

Я представил новую версию на моем Carrierwave Uploader.Когда я создаю новый Event, он создает обе версии правильно.Но когда я обновляю его, загружается только прикрепленный файл, но версии не воссоздаются.

Я использую CarrierWave 1.2.2 и, глядя на журнал изменений, похоже, это не ошибкаэто исправлено в более новых версиях

class CoverUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  if Rails.env.development? || Rails.env.test?
    storage :file
  elsif Rails.env.production?
    storage :fog
  end

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    if ENV['HEROKU_APP_NAME'].to_s.include?('-pr-')
      "review_apps/#{model.class.to_s.underscore}/#{model.id}"
    else
      "#{Rails.env}/#{model.class.to_s.underscore}/#{model.id}"
    end
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url(*args)
    ActionController::Base.helpers.asset_path('test.jpg')
  end

  # Create different versions of your uploaded files:
  version :optimised do
    process convert: 'webp'
    process :set_content_type_to_webp

    def full_filename(_for_file = model.cover.file)
      "cover_#{model.id}.webp"
    end

    def exists?
      file&.exists?
    end
  end

  def extension_blacklist
    %w(webp)
  end

  private

  # Required to actually force Amazon S3 to treat it like an image
  def set_content_type_to_webp
    file.instance_variable_set(:@content_type, 'image/webp')
  end
end

Ответы [ 3 ]

0 голосов
/ 15 марта 2019

Я проверил ваш код и обнаружил ошибку.

Невозможно инициализировать переменную _for_file в методе full_filename

def full_filename(_for_file = model.cover.file)
  "cover_#{model.id}.webp"
end

model.cover вызвать ошибку неопределенный метод cover 'при создании оптимизированной версии.

0 голосов
/ 16 марта 2019

@ ogelacinyc был частично прав, когда обнаружил ошибку в full_filename.Я вернулся к тестированию нормальной функциональности, создав другую версию с простым изменением размеров.Затем я мог видеть, что обновление воссоздает версии само по себе, как я и ожидал.

Это заставило меня подумать, что, возможно, что-то не так с моим version :optimised блоком.Поэтому, прокомментировав один за другим, я обнаружил, что full_filename был виновником.Это могло быть model.cover.file сбоем молча, но я думаю, что это было model.id, как можно увидеть в описании для метода имени файла в Carrierwave

Так что вместо этого я беру имя файланепосредственно, распакуйте расширение и замените его webp:

  def full_filename(for_file = model.file_name.file)
    extension = File.extname(for_file)
    "cover_#{for_file.sub(extension, '.webp')}"
  end

, который работает без проблем!

0 голосов
/ 14 марта 2019

Вам необходимо добавить обратный вызов after_save к событию, а затем вызвать recreate_versions! на подключенном загрузчике.

Если у вас есть модель события со следующим, это решит вашу проблему.

class Event < ApplicationRecord
  mount_uploader :cover_image, CoverUploader
  after_save :recreate_versions!
  delegate :recreate_versions!, to: :cover_image, allow_nil: true
end

См. Также README CarrierWave .

...