我正在尝试测试我的代码上是否使用载波更改了图像,但我找不到这样做的方法。即使文件无效,似乎对象也被标记为已更改,因此它并未真正更改。
查看以下输出:
(rdb:1) job.translated_xliff
#<XliffUploader:0xcd8b380 ...>
(rdb:1) job.changed?
false # As expected, didn't changed yet
(rdb:1) job.translated_xliff = "foo"
"foo"
(rdb:1) job.changed?
true # Changed? "foo" is not a valid file. Lets see the file again...
(rdb:1) job.translated_xliff
#<XliffUploader:0xcd8b380 ...> # same object ID!
如何检查我的代码上是否真的更改了此对象?
编辑:我打开issue on github,但问题仍未解决,但可以在那里找到更多信息答案 0 :(得分:4)
内部Carrierwave在上传者列(getter/setter
)上定义(覆盖)ActiveRecord translated_xliff
现在,每次调用setter方法job.translated_xliff ='foo'(由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
)是Path
或File
,在您的情况下它不是两个,因此文件永远不会缓存,但对象标记为changed
因此你得到了这个
job.changed?
=> true
现在,在调用job.translated_xliff
方法的同时,它从商店中提取file
,因为提供的value
从未被缓存过,您可以看到它在here上工作
因此我在评论中提到如果你想要实现某种类型的东西,或许你可以检查identifier
并确定它是否发生了变化
job.translated_xliff.identifier == "foo"
只是一个建议:)
希望这个帮助