ruby-on-rails - 如何重新处理carrierwave中的图像版本?
问题描述
我正在尝试编写一个 rake 任务,它应该在我更改上传器文件中的版本参数后重新处理我上传的所有图像版本。
我希望能够从 bash 或 rails 控制台调用它。出于这个原因,我reprocess
为相关模型编写了一个 rake 任务和一个方法diapo.rb
,我可以在 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
...
初始上传顺利。只有预处理会引发此错误。
解决方案
recreate_versions!
方法适用于attribute
模型中的对应项。
在你的情况下,它应该是这样的:
class Diapo < ActiveRecord::Base
mount_uploader :file_name, DiapoUploader
def reprocess
file_name.recreate_versions!
end
end
推荐阅读
- android - 如何使用我们自己的应用程序添加新指纹?
- sql - XML 嵌套/分组的 SQL 查询
- scala - 如何使用if else表达式在scala中分配不同的变量名
- python-3.x - Python Discord Bot,需要服务器 ID
- android - 使用 Android 客户端监听 io 套接字事件
- mysql - SQL 数据类型不匹配
- java - 在 Spring MVC 4.3 中重定向后缺少 flash 属性
- asp.net-core - .NET Core 2 中的 System.Web.ApplicationServices
- python - 如何将变量放入文本文件?
- sql - 通过sql提取excel数据;日期列不起作用