如何测试carrierwave文件是否已更改?

我正在尝试测试我的代码上是否使用载波更改了图像,但我找不到这样做的方法。 即使文件无效,似乎对象也被标记为已更改,因此它并未真正更改。

查看以下输出:

(rdb:1) job.translated_xliff # (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 # # same object ID! 

如何检查我的代码上是否真的更改了此对象?

编辑:我在github上打开了一个问题 ,但问题仍未解决,但可以在那里找到更多信息

内部Carrierwave在上传器列上定义(覆盖)ActiveRecord getter/settertranslated_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 )是一个PathFile ,在您的情况下它不是两个,因此该文件永远不会缓存,但该对象被标记为已changed

因此你得到了这个

 job.changed? => true 

现在,在调用job.translated_xliff方法的同时,它从商店中提取file ,因为提供的value从未被缓存,你可以看到它在这里工作

因此我在评论中提到如果您想要实现某种类型的东西,也许您可​​以检查identifier并确定它是否发生了变化

job.translated_xliff.identifier == "foo"

只是一个建议虽然:)

希望这有帮助