【问题标题】:How to reprocess image versions in carrierwave?如何重新处理carrierwave中的图像版本?
【发布时间】:2020-04-08 22:51:06
【问题描述】:

我正在尝试编写一个 rake 任务,它应该在我更改上传器文件中的版本参数后重新处理我上传的所有图像版本。

我希望能够从 bash 或 rails 控制台调用它。出于这个原因,我为相关模型diapo.rb 编写了一个rake 任务和一个方法reprocess,我可以在rake 任务中调用它。 (我关注了这个答案https://stackoverflow.com/a/31220535

目前我有一个资源模型 Diapo.rb

class Diapo < ActiveRecord::Base

  mount_uploader :file_name, DiapoUploader

  def reprocess
    begin
      self.cache_stored_file!
      self.retrieve_from_cache!(self.cache_name)
      self.recreate_versions!
      self.save!
    rescue => e
      STDERR.puts  "ERROR: MyModel: #{id} -> #{e.to_s}"
    end
  end
end

在我的上传文件中,我指定了一系列版本 diapo_uploader.rb

class DiapoUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  include CarrierWave::MimeTypes

  process :set_content_type

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.downcase.pluralize}/#{mounted_as}/#{model.id}"
  end

  version :diapo0500, :if => :diapo? do
    process :resize_to_fit => [500, 500]
    process :quality => 50
  end

  version :thumb, :if => :diapo? do
    process :resize_to_fit => [200, 200]
    process :quality => 50
  end
end

我写了一个rake任务:carrierwave.rake

# CarrierWave rake tasks
#
# Task:   reprocess
# Desc:   Reprocess all diapos
# Usage:  rake carrierwave:reprocess_diapo

namespace :carrierwave do
  task :reprocess_diapo => :environment do
    Diapo.all.each do |d|
      d.reprocess
    end
  end
end

目前我得到:

$ rake carrierwave:reprocess_diapo
ERROR: MyModel: 1 -> undefined method `cache_stored_file!' for #<Diapo:0x111cd8428>
ERROR: MyModel: 2 -> undefined method `cache_stored_file!' for #<Diapo:0x111c98300>
ERROR: MyModel: 3 -> undefined method `cache_stored_file!' for #<Diapo:0x111c97db0>
ERROR: MyModel: 4 -> undefined method `cache_stored_file!' for #<Diapo:0x111c97798>
ERROR: MyModel: 5 -> undefined method `cache_stored_file!' for #<Diapo:0x111c97108>
ERROR: MyModel: 6 -> undefined method `cache_stored_file!' for #<Diapo:0x111c96af0>

Rails 是 3.2.5 载波为 0.11.1

我做错了什么?

提前谢谢你!

更新

感谢@Abhishek,我通过添加相关属性更新了我的模型 Diapo.rb:

class Diapo < ActiveRecord::Base

  mount_uploader :file_name, DiapoUploader

  def reprocess
    begin
      self.file_name.cache_stored_file!
      self.file_name.retrieve_from_cache!(self.file_name.cache_name)
      self.file_name.recreate_versions!
      self.save!
    rescue => e
      STDERR.puts  "ERROR: MyModel: #{id} -> #{e.to_s}"
    end
  end
end

这次我得到以下错误:

$ rake carrierwave:reprocess_diapo
ERROR: MyModel: 1 -> uninitialized constant MimeMagic::Encoding
...

初始上传顺利。只有预处理会引发此错误。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 carrierwave


    【解决方案1】:

    recreate_versions! 方法作用于模型中对应的attribute

    在你的情况下,它应该是这样的:

    class Diapo < ActiveRecord::Base
    
      mount_uploader :file_name, DiapoUploader
    
      def reprocess
        file_name.recreate_versions!
      end
    end
    

    【讨论】:

    • 谢谢@Abhishek!现在我得到uninitialized constant MimeMagic::Encoding。你知道为什么吗?
    • include CarrierWave::MimeTypes #---------------> 这行可能是你 DiapoUploader 中的问题
    • 我试图将其注释掉,但无济于事......而且初始上传也很顺利。只有重新处理会引发错误......
    • 我在 Rails 6 中使用 Carrierwave 2.0.2 进行了尝试,并进行了重新处理! Carrierwave 0.11.1 存在一些问题。我会将您的答案标记为正确。
    猜你喜欢
    • 2011-07-05
    • 2011-07-05
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2017-01-18
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多