Rails模型验证与文件

时间:2010-11-02 23:23:38

标签: ruby-on-rails ruby models

我被困在我的网站的某个特定部分已经有几天了,而且一直很沮丧。我有代码在用户的activerecord模型中的logo = setter中为用户上传徽标(下面的代码),但是这使我无法使用模型的验证。有没有办法让我重新排列以下代码,以便它“非常”并允许我使用模型验证?

由于

模型/ developer.rb

require 'fileutils'

class Developer < ActiveRecord::Base
 has_many :games
 has_many :user_associations
 has_many :users, :through=>:user_associations

 validates_uniqueness_of :name
 validates_length_of :name, :in=>4...16
 #validates_filesize_of :logo, :in=>1.kilobytes..100.kilobytes, :message=>'Logo must be between 1 and 100 kilobytes'

 def logo
   @logo
 end

 def logo=(file)
   errors.add_to_base('Image should be a PNG, JPEG or GIF file') and return if !(['.gif', '.jpg', '.jpeg', '.png'].include? File.extname(file.original_filename).downcase)
  logo_format=File.extname(file.original_filename).downcase
  image_path=RAILS_ROOT+'/logos/'+to_param
  @logo=file.path
  FileUtils.mv(file.path, image_path)
 end

 def self.fetch(id)
   Developer.find_by_name(id.gsub(/_/, ' '))
 end

  def to_param
    return name.gsub(/[ ]/, '_').downcase;
  end

end

controllers / developer_controller.rb(相关位)

class DeveloperController < ApplicationController
  before_filter :load_developer

  def index
   redirect_to :controller=>'developers', :action=>'list' if params[:id].nil?
 end

 def manage
 end

 def set_logo
  if request.post? and !params[:logo].nil?
   @active_developer.logo=params[:logo]
   @write=@active_developer.logo
   @active_developer.save
  end
 end

private

  def load_developer
    if !params[:id].nil?
      @active_developer=Developer.fetch params[:id]
   else
     @active_developer=nil
   end
 end

end

2 个答案:

答案 0 :(得分:2)

您可能会混淆一些概念。正如上面提到的tadman,现有的插件可能是最好的方式,attachment_fu是另一个值得尝试的好方法。如果你决定自己推出,你通常会:

  • 将上传的文件保存到临时文件
  • 请记住,您的表单上有
    :html => { :multipart => true }
  • 在模型中创建一个属性(与数据库字段无关)以保存上传的文件数据(名称/临时文件位置)
  • 使用
    after_validation :save_file_attachment
    (在验证后运行)将文件移动到正确的位置,将文件名放入徽标属性。

只是一些想法,我希望有所帮助。除非这是一个学习练习,否则请使用插件:)

答案 1 :(得分:1)

您可能希望使用更强大的附件系统,例如Paperclip来完成所有这些操作,而不是滚动您自己的附件系统。有一些方法可以验证文件类型,大小和许多其他内容,以及为您准备缩略图应该是否需要。