论坛首页 编程语言技术论坛

File Column 的验证,中文提示,容易出错的细节和图片位置的获得

浏览 2286 次
精华帖 (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 %>
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics