2010-11-02 3 views
0

Я застрял на определенной части своего веб-сайта в течение нескольких дней и очень разочаровывался. У меня есть код для загрузки логотипа для пользователя (код ниже) внутри модуля logo = setter в пользовательской модели activerecord, но это мешает мне использовать проверки модели. Есть ли способ изменить следующий код, чтобы он был «хорошеньким» и позволил мне использовать проверки модели?Проверка модели Rails с файлами

Благодаря

модели/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 

Контроллеры/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] 
    @[email protected]_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

Возможно, некоторые из понятий озадачены. Как сказал вышедший тадман, существующий плагин, вероятно, лучший способ пойти, attachment_fu - еще один хороший пример. Если вы решили свернуть свой собственный, вы обычно:

  • Сохранить загруженный файл во временный файл
  • Помните, чтобы иметь
    :html => { :multipart => true }
    на форме
  • Создать атрибут в модели (это не связано с поле базы данных) для хранения загруженных данных файла (имя/временное расположение файлов)
  • Используйте
    after_validation :save_file_attachment
    (который выполняется после проверки), чтобы переместить файл в нужное место, поместите имя файла в атрибут логотипа.

Просто некоторые идеи, я надеюсь, что это поможет. Если это не учебное упражнение, перейдите с плагином :)

+0

Спасибо, ты блестящий, я тебя люблю: D after_validation именно то, что я искал! – alex

1

Вместо прокатки собственную систему крепления, вы можете используйте более надежный, такой как Paperclip, который делает все это для вас. Существуют методы для проверки типа файла, размера и многих других вещей, а также для подготовки эскизов для вас, если это необходимо.

Смежные вопросы