新手问题 carrierwave-upyun 0.2.1 之后的 validate 好像有点小问题

oyaxira · September 20, 2017 · Last by dfzy5566 replied at September 20, 2017 · 883 hits

之前的都是老项目使用的 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?方法。

还有没有什么比较好的办法呢?

你也可以自己 fork 一个呀

You need to Sign in before reply, if you don't have an account, please Sign up first.