浏览 2299 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-30
先说验证问题。
按照传统的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 %> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |