如何更改CarrierWave的min_size& max_size错误消息?

时间:2017-02-06 10:01:54

标签: ruby-on-rails ruby carrierwave

我使用以下方法验证图像的文件大小:

class ImageUploader < CarrierWave::Uploader::Base

  def size_range
    0..200.kilobytes
  end

不幸的是,我的用户收到的错误消息有点神秘:

  

图像尺寸应小于204800

有没有办法将其更改为更有意义的内容,例如:

  

图像大小应小于2 MB

我尝试了各种方法但无济于事。

顺便说一下,这些是我的本地化文件:

errors:
  messages:
    min_size_error: size should be greater than %{min_size}
    max_size_error: size should be less than %{max_size}

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

要使错误消息更友好,请覆盖carrierwave&#39; check_size! FileUploader中的方法,代码如下:

class ImageUploader < CarrierWave::Uploader::Base

  def size_range
    0..200.kilobytes
  end

  private

  def check_size!(new_file)
    size = new_file.size
    expected_size_range = size_range
    if expected_size_range.is_a?(::Range)
      if size < expected_size_range.min
        raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.min_size_error", :min_size => ApplicationController.helpers.number_to_human_size(expected_size_range.min))
      elsif size > expected_size_range.max
        raise CarrierWave::IntegrityError, I18n.translate(:"errors.messages.max_size_error", :max_size => ApplicationController.helpers.number_to_human_size(expected_size_range.max))
      end
    end
  end
end

答案 1 :(得分:1)

您可以通过自定义验证器更改验证消息

如下所示

class Product < ActiveRecord::Base 
  mount_uploader :file,  ImageUploader
  validate :up_file_size
  validate :down_file_size

  def up_file_size
    if file.file.size.to_f/(1000*1000) > 200.kilobytes
      errors.add(:file, "size should be less than #{max_upload_limit.to_f}MB")
    end
  end

 def down_file_size
    if file.file.size.to_f/(1000*1000) < 0
      errors.add(:file, "size should be greater than #{min_upload_limit.to_f}MB")
    end
  end
 end

答案 2 :(得分:1)

通过使用内置文件大小验证程序,您很遗憾地被绑定到its implementation

def check_size!(new_file)
  size = new_file.size
  expected_size_range = size_range
  if expected_size_range.is_a?(::Range)
    if size < expected_size_range.min
      raise CarrierWave::IntegrityError,
        I18n.translate(
          :"errors.messages.min_size_error",
          :min_size => expected_size_range.min
        )
    elsif size > expected_size_range.max
      raise CarrierWave::IntegrityError,
        I18n.translate(
          :"errors.messages.max_size_error",
          :max_size => expected_size_range.max
        )
    end
  end
end

可以简单地覆盖该方法,为min_sizemax_size提供一些其他值(例如,以兆字节而不是字节为单位)。

或者,as explained the CarrierWave wiki,你可以使用像file_validators这样的宝石,或者复制this gist,甚至可以很容易地编写自己的文件验证器,而不是依靠内置的CarrierWave版本

该页面上给出的最简单的自定义验证器示例(我只是复制+粘贴,以防链接在将来死亡)是:

# app/models/user.rb 
class User< ActiveRecord::Base 
  attr_accessible :product_upload_limit
  has_many :products
end

# app/models/brand.rb 
class Product < ActiveRecord::Base 
  mount_uploader :file, FileUploader
  belongs_to :user
  validate :file_size

  def file_size
    if file.file.size.to_f/(1000*1000) > user.product_upload_limit.to_f
      errors.add(:file, "You cannot upload a file greater than #{upload_limit.to_f}MB")
    end
  end
end