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

oyaxira · 2017年09月20日 · 最后由 dfzy5566 回复于 2017年09月20日 · 883 次阅读

之前的都是老项目使用的 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 一个呀

需要 登录 后方可回复, 如果你还没有账号请 注册新账号