之前的都是老项目使用的 carrierwave-upyun 锁定在了 0.1.7
新开的项目用了新的之后发现 validates 出了点小问题
主要是 validates: avatar presence: true 的判定不太对。
0.2.1 之后 CarrierWave::Storage::UpYun::File 继承了 CarrierWave::SanitizedFile
presence 本身调用的是对象的 blank?
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 15
def blank?
respond_to?(:empty?) ? !!empty? : !self
end
在修改继承关系之前由于 CarrierWave::Storage::UpYun::File 没有 empty?方法所以会直接返回!self
但是继承关系变了之后,在判断 presence 的时候会调用 CarrierWave::SanitizedFile 下的 empty?方法
https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/sanitized_file.rb 139 行
def empty?
@file.nil? || self.size.nil? || (self.size.zero? && ! self.exists?)
end
so 就悲剧了。于是赋值的时候 validate 没问题。但是 save 完执行 valid?就会返回 false
目前只能在项目的 BaseUploader 里。打了个猴子补丁重新定义了一个 blank?方法。
还有没有什么比较好的办法呢?