Carrierwave 内部定义(覆盖)ActiveRecordgetter/setter
在上传者栏(translated_xliff
)
现在每次调用 setter 方法 job.translated xliff = 'for' (如Bensie
) 它用ActiveRecord::Dirty
_will_change!
通知对象发生变化的方法
接下来是 CarrierWave 缓存提供的file
这是你的场景
job.translated_xliff
=> uploader
job.changed?
=> false
job.translated_xliff = "foo"
## Now your trying to change the object so will_change! notify that
##'translated_xliff' is changing after which Carrierwave try to cache the given 'file'(foo)
现在问题就在 Carriewave 开始缓存文件之前,它执行如下基本检查
new_file = CarrierWave::SanitizedFile.new(new_file)
unless new_file.empty?
## Then do caching
end
empty?
用于确定提供的值(在您的情况下foo
) is a Path
or File
在您的情况下,它不是两个,因此文件永远不会缓存,但对象被标记为changed
因此你得到这个
job.changed?
=> true
现在结果是在打电话时job.translated_xliff
它拉的方法file
自提供以来从商店value
从未被缓存过,你可以看到它正在运行here https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/mount.rb#L317
因此,我在评论中提到,如果您想实现此类目标,也许您可以检查identifier
并决定是否改变
job.translated_xliff.identifier == "foo"
只是一个建议:)
希望这有帮助