如何更改 CarrierWave 的 min_size & max_size 错误信息?
How to change CarrierWave's min_size & max_size error messages?
我正在使用以下方法来验证我的图像的文件大小:
class ImageUploader < CarrierWave::Uploader::Base
def size_range
0..200.kilobytes
end
不幸的是,我的用户收到的错误消息有点含糊:
Image size should be less than 204800
有没有办法将其更改为更有意义的内容,例如:
Image size should be less than 2 MB
我尝试了各种方法,但都无济于事。
顺便说一句,这些是我的本地化文件:
errors:
messages:
min_size_error: size should be greater than %{min_size}
max_size_error: size should be less than %{max_size}
感谢您的帮助。
您可以通过自定义验证器更改验证消息
喜欢下面
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
通过使用 built-in 文件大小验证器,不幸的是您被限制在 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_size
和 max_size
提供一些其他值(例如兆字节数而不是字节数)。
或者,as explained the CarrierWave wiki, you could use a gem like file_validators, or copy this gist,甚至可以很容易地编写自己的文件验证器,而不是依赖 built-in CarrierWave 版本。
该页面上给出的最简单的自定义验证器示例(我只是在此处复制粘贴以防 link 将来死亡)是:
# 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
为了使错误消息更友好,请覆盖 carrierwave 的 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
我正在使用以下方法来验证我的图像的文件大小:
class ImageUploader < CarrierWave::Uploader::Base
def size_range
0..200.kilobytes
end
不幸的是,我的用户收到的错误消息有点含糊:
Image size should be less than 204800
有没有办法将其更改为更有意义的内容,例如:
Image size should be less than 2 MB
我尝试了各种方法,但都无济于事。
顺便说一句,这些是我的本地化文件:
errors:
messages:
min_size_error: size should be greater than %{min_size}
max_size_error: size should be less than %{max_size}
感谢您的帮助。
您可以通过自定义验证器更改验证消息
喜欢下面
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
通过使用 built-in 文件大小验证器,不幸的是您被限制在 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_size
和 max_size
提供一些其他值(例如兆字节数而不是字节数)。
或者,as explained the CarrierWave wiki, you could use a gem like file_validators, or copy this gist,甚至可以很容易地编写自己的文件验证器,而不是依赖 built-in CarrierWave 版本。
该页面上给出的最简单的自定义验证器示例(我只是在此处复制粘贴以防 link 将来死亡)是:
# 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
为了使错误消息更友好,请覆盖 carrierwave 的 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