【发布时间】:2018-10-19 14:20:01
【问题描述】:
我将 carrierwave 从 0.11.0 升级到 1.2.3 并意识到,对我来说至关重要的是,行为已经改变并打破了我的逻辑。这是我的上传器的示例。
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :fog
version :thumb do
process :convert => :jpg
def default_url
'/assets/document_thumb.png'
end
end
end
还有它安装的模型:
class Material < ActiveRecord::Base
attr_accessible :name, :file
mount_uploader :file, FileUploader, validate_processing: false
before_create :create_file_hash
def create_file_hash
self.hash_digest = Digest::MD5.hexdigest(file.read)
end
end
在旧的carrierwave中,即使版本处理(例如在这种情况下转换)失败,文件的主要版本仍会被上传和存储。但是,现在在处理失败的情况下(并非总是如此,但我不能进行条件处理,因为我的情况比这里说明的更复杂)没有任何内容被存储。 file 属性仍然是一个空的(空白)上传器,并且没有任何内容上传到雾存储。
知道如何恢复旧的行为吗?
换句话说,如何忽略处理版本的任何错误。或者不在after_cache 回调中触发版本处理,而是在稍后的某个时间触发?
我认为我已经将此问题追溯到Mounter#cache 方法的以下更改:
def cache(new_files)
return if not new_files or new_files == ""
@uploaders = new_files.map do |new_file|
uploader = blank_uploader
uploader.cache!(new_file)
uploader
end
@integrity_error = nil
@processing_error = nil
rescue CarrierWave::IntegrityError => e
@integrity_error = e
raise e unless option(:ignore_integrity_errors)
rescue CarrierWave::ProcessingError => e
@processing_error = e
raise e unless option(:ignore_processing_errors)
end
过去只是直接执行uploader.cache!(new_file)(不在地图中),然后uploader 一路更新并在需要时返回模型。但是,现在处理错误导致地图块退出,@uploaders 数组永远不会被有效的上传器更新(即原始文件)。
【问题讨论】:
-
忘记包含我在贴片机上确实拥有的
validate_processing: false选项。从某种意义上说,模型验证不会失败并且模型确实会被保存。只是没有上传者。
标签: carrierwave ruby-on-rails-4.2 fog