5

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

查看以下输出:

(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!

我如何检查这个对象是否真的在我的代码上被改变了?

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

4

1 回答 1

4

Carrierwave 在内部定义(覆盖)getter/setter上传者列 ( translated_xliff)上的 ActiveRecord

现在每次调用 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)是 aPathFile在您的情况下两者都不是,因此文件永远不会缓存,但对象被标记为changed

因此你得到了这个

job.changed?
=> true 

现在,由于提供的从未缓存过, 因此在调用它从商店中job.translated_xliff提取的方法时,您可以看到它在此处工作filevalue

因此我在评论中提到如果你想实现那种东西,也许你可以检查identifier并决定它是否改变了

job.translated_xliff.identifier == "foo"

只是一个建议:)

希望这有帮助

于 2013-08-02T19:57:09.657 回答