先说验证问题。
按照传统的file_column :image, :magick => xxx
无论你想不想验证,file_column 都会验证上传的文件是不是图形文件,如果不是,它会在你的模型错误里面加"invalid image"。该错误验证的地方在 magick_file_column.rb里。查找
if options[:magick][:image_required]
@magick_errors ||= []
@magick_errors << "invalid image"
end
可以将第3行修改为:
@magick_errors << (options[:error_message] || "invalid image")
这样,就可以在file_column 时加上 :error_message来提示非图形文件的错误信息。
然后,file column自带了3个错误验证方法:
validates_file_format_of 验证文件类型,也就是后缀名。options是:in
比如验证后缀为jpg png gif的图形文件可以
validates_file_format_of :image, :in => ["gif", "png", "jpg"]
出错信息默认:"is not a valid format."
想修改为中文错误信息,可以修改validations.rb中的validates_file_format_of方法。
查找:
record.errors.add attr, "is not a valid format." unless extensions.include?(value.scan(EXT_REGEXP).flatten.first)
这一行
将其中的字符串改为你想要的中文即可,也可以用option的方法。我是改成。
options[:message] = [options[:messge]].to_s || "is not a valid format."
record.errors.add attr, options[:message] unless extensions.include?(value.scan(EXT_REGEXP).flatten.first)
这样就可以使用
validates_file_format_of :image, :in => ["gif", "png", "jpg"], :message => "只能是后缀为jpg, png, gif的文件"
validates_filesize_of 验证文件大小,options也是:in
比如验证1M的文件
validates_filesize_of :image, :in => 0..1.megabyte
错误信息分 太大 和 太小 两个。默认信息还是查看文件validations.rb的validates_filesize_of方法。可以参照validates_file_format_of的方法修改错误提示,改为我们习惯的:too_small和:too_large
第3个方法是验证图片大小 validates_image_size,是验证XxY的。不是文件大小。options只有:min。中文化参照前两个。
再来说说file column使用中容易出错的地方。
1.需要有数据库表对应字段。用来存文件名的
2.file_column_field和url_for_file_column 中如果用Symbol出错,最好都写成字符串,比如缩略图要用'thumb'不要:thumb
3.validates_filesize_of :image, :in => 0..1.megabyte 不会判空,所以 validates_present_of :image是必须的
4.上传的图片要resize,要在:magick里加:geometry,不要写到:versions里面了。
5.上传中文图片是乱码的问题,虽然注释掉filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"_")可以,但是还是会不定期出现特殊问题,所以最好的是上传后修改文件名,在file_column.rb中搜索@filename = FileColumn::sanitize_filename(file.original_filename),将file.original_filename改成你想要的名字。
图片位置的获取:
用一个头像Portrait举例,User has_one Portrait
class Portrait < ActiveRecord::Base
belongs_to :user
file_column :image, :magick => {
:versions => { "thumb" => "72x72", "icon" => "36x36>"},
:geometry => "150x150>", :error_message => "不是图形文件"
}
validates_filesize_of :image, :in => 0..1.megabyte, :too_large => "不能大于1M“
validates_file_format_of :image, :in => ["gif", "png", "jpg"], :message => "必须是后缀为jpg png gif的图形文件"
validates_presence_of :image
end
我们想在User里直接得到头像的原图,缩略图和图标,可以这样
class User < ActiveRecord::Base
has_one :portrait
def main_portrait
"/portrait/image/" + portrait.send("image_relative_path")
end
def thumbnail
"/portrait/image/" + portrait.send("image_relative_path", "thumb")
end
def icon
"/portrait/image/" + portrait.send("image_relative_path", "icon")
end
end
这样就可以直接使用:
<%= image_tag @user.thumbnail %>