fot*_*nus 5 activerecord ruby-on-rails carrierwave
我正在尝试测试我的代码上是否使用载波更改了图像,但我找不到这样做的方法.即使文件无效,似乎对象也被标记为已更改,因此它并未真正更改.
查看以下输出:
(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!
Run Code Online (Sandbox Code Playgroud)
如何检查我的代码上是否真的更改了此对象?
getter/setterCarrierwave 内部定义(覆盖)上传者列上的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)
Run Code Online (Sandbox Code Playgroud)
现在问题就在 Carriewave 开始缓存文件之前,它执行如下基本检查
new_file = CarrierWave::SanitizedFile.new(new_file)
unless new_file.empty?
## Then do caching
end
Run Code Online (Sandbox Code Playgroud)
empty?用于确定提供的值(在您的情况下它foo)是一个Path或File,并且在您的情况下它不是两个,因此文件永远不会缓存,但对象被标记为changed
因此你得到这个
job.changed?
=> true
Run Code Online (Sandbox Code Playgroud)
现在,在调用该方法时,它会从存储中job.translated_xliff提取数据,因为所提供的内容从未被缓存,您可以 在此处看到它的工作情况filevalue
因此我在评论中提到如果你想实现类似的目标,也许你可以检查identifier并决定它是否改变
job.translated_xliff.identifier == "foo"
只是一个建议:)
希望这有帮助
| 归档时间: |
|
| 查看次数: |
2025 次 |
| 最近记录: |