我被困在我的网站的某个特定部分已经有几天了,而且一直很沮丧。我有代码在用户的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
答案 0 :(得分:2)
您可能会混淆一些概念。正如上面提到的tadman,现有的插件可能是最好的方式,attachment_fu是另一个值得尝试的好方法。如果你决定自己推出,你通常会:
:html => { :multipart => true }
after_validation :save_file_attachment(在验证后运行)将文件移动到正确的位置,将文件名放入徽标属性。
只是一些想法,我希望有所帮助。除非这是一个学习练习,否则请使用插件:)
答案 1 :(得分:1)
您可能希望使用更强大的附件系统,例如Paperclip来完成所有这些操作,而不是滚动您自己的附件系统。有一些方法可以验证文件类型,大小和许多其他内容,以及为您准备缩略图应该是否需要。