【问题标题】:rails custom validator to validate mime types with carrier waverails 自定义验证器使用载波验证 mime 类型
【发布时间】:2013-02-08 08:45:00
【问题描述】:

我正在使用以下方式来验证上传文件内容的mime类型与载波。

https://gist.github.com/denyago/1298417

但即使没有上传任何内容,此验证也会一直运行。这显然失败了,因为没有什么可以验证的。

 validates :logo, :file_mime_type => {:content_type => /image/}

没有上传内容时,是否有任何解决方法可以跳过验证?

谢谢!!

更新:

在没有上传的内容存在之前,使用 proc 或 lambda 效果很好。

      ..., if => Proc.new{|company| company.logo.present?}

      @company.save #works will when @company contains correct mime type logo file 

      @company.save #fails when @company contains no logo file  

一旦有人上传了徽标,它就会正确保存对象,并开始在没有图像上传的任何其他保存上引发错误的 mime 类型异常。

【问题讨论】:

    标签: ruby-on-rails-3 validation mime-types carrierwave


    【解决方案1】:

    尝试添加if条件。例如:

    validates :logo, :file_mime_type => {:content_type => /image/}, :if => Proc.new{|img| img.logo.present?}

    【讨论】:

    • 感谢您抽出宝贵时间,但如果应用程序中已经存在徽标以便 img.logo.present?返回真。
    • 但是你说“没有上传任何内容”。你能澄清一下情况吗?
    • 如果徽标已经存在,则此验证应通过(除非您的徽标无效。您有无效记录吗?无法更新?)
    • 不,那不是问题。记录有效且内容有效的文件类型。
    • 那么,如果记录有效,为什么要跳过验证?
    【解决方案2】:

    我在尝试保存包含载波属性的模型时遇到了这个问题,比如您的示例中的图像标题。

    validates :logo, :file_mime_type => { :content_type => /image/ },
    :if => Proc.new{ |img| img.logo.present? and img.logo_changed? }
    

    _改变了吗?可用于判断该特定属性是否已更改:How to detect attribute changes from model?

    【讨论】:

      【解决方案3】:

      如载波文档中所述。

      class MyUploader < CarrierWave::Uploader::Base
        def extension_white_list
         %w(jpg jpeg gif png)
        end
      end
      

      【讨论】:

      • 谢谢,但它只验证扩展而不是内容。您只需更改扩展名即可将视频文件作为图像上传。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2012-10-24
      • 2021-07-20
      • 2011-07-08
      • 1970-01-01
      相关资源
      最近更新 更多