2010-11-02 3 views
0

J'ai été coincé sur une partie de mon site Web pendant quelques jours et j'ai été très frustré. J'ai un code pour télécharger un logo pour un utilisateur (code ci-dessous) à l'intérieur du logo = setter dans le modèle activerecord de l'utilisateur, mais cela m'empêche d'utiliser les validations du modèle. Existe-t-il un moyen pour moi de réorganiser le code suivant afin qu'il soit à la fois "joli" et me permet d'utiliser des validations de modèles?Validation du modèle Rails avec des fichiers

Merci

modèles/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 

contrôleurs/developer_controller.rb (les bits correspondants)

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 

Répondre

2

Vous pouvez avoir certains des concepts confus. Comme tadman mentionné ci-dessus, un plugin existant est probablement le meilleur moyen d'aller, attachment_fu est un autre bon à essayer. Si vous décidez de rouler votre propre, vous habituellement:

  • Enregistrez le fichier téléchargé dans un fichier temporaire
  • Rappelez-vous d'avoir
    :html => { :multipart => true }
    sur votre formulaire
  • Créer un attribut dans le modèle (ce n'est pas associé à Utilisez le
    after_validation :save_file_attachment
    (qui s'exécute après la validation) pour déplacer le fichier au bon emplacement, placez le nom du fichier dans l'attribut du logo.

Juste quelques idées, j'espère que cela aide un peu. A moins que ce soit un exercice d'apprentissage, allez avec un plugin :)

+0

Merci, vous êtes génial, je vous aime: D after_validation est exactement ce que je cherchais! – alex

1

Au lieu de rouler votre propre système de fixation, vous voudrez peut-être Utilisez un modèle plus robuste tel que Paperclip qui fait tout cela pour vous. Il existe des méthodes pour valider le type de fichier, la taille et bien d'autres choses, ainsi que la préparation de vignettes pour vous, si ce genre de chose est nécessaire.

Questions connexes