2010-09-17 8 views
0

J'ai brisé un peu le principe DRY dans un projet construit avec Paperclip pour le stockage multimédia. J'ai ajouté des actifs à certains modèles, tels que AlbumPhotoFile, AlbumSoundFile et ainsi de suite, en utilisant le code suivant:Rails Paperclip 'méthodes de classe' et refactorisation des validations?

# Asset is a regular < ActiveRecord::Base class 
class AlbumPhotoFile < Asset 
    has_attached_file :pic, :url => "foo", :path => "bar" 
    validates_attachment_presence :pic, :message => "can't be blank" 
    validates_attachment_content_type :pic, :content_type => ["foo", "bar"] 
end 

Mise à l'échelle de quelques autres exigences, je devais joindre des photos à d'autres modèles, par exemple CityPhotoFile. Je veux conserver les validations et has_attached_file fu comme dans les autres modèles de type PhotoFile. Je viens de copier-coller le code d'un modèle PhotoFile à l'autre, y a-t-il une meilleure méthode pour cela?

Il n'y a pas d'erreurs liées au Paperclip, le stockage et l'affichage fonctionnent bien, je voulais juste savoir si ce type d'opération peut être placé dans un module ou quelque chose comme ça, pour DRY. Juste rebondir sur le code devient vraiment moche. Je peux fournir plus de détails si je n'ai pas fait mes intentions claires dans cet espace :-).

Merci d'avance!

Répondre

2

est ici ce qui a fonctionné pour moi, basé sur la solution de Mr.Matt:

# in lib/paperclip_template_audio.rb, for instance 
module PaperclipTemplateAudio 

    # Stuff directives into including module 
    def self.included(recipient) 
    recipient.class_eval do 
     has_attached_file :pic, :url => "foo", :path => "bar" 
     validates_attachment_presence :pic, :message => "can't be blank" 
     validates_attachment_content_type :pic, :content_type => ["foo", "bar"] 
    end 
    end 

end # Module 

Dans mon modèle:

class AlbumPhotoFile < ActiveRecord::Base 
    include PaperclipTemplateAudio 
end 
1

Ouais, vous pouvez déplacer ce code sur dans un module, puis l'inclure dans votre classe comme suit:

# in lib/default_paperclip 
module DefaultPaperclip 
    has_attached_file :pic, :url => "foo", :path => "bar" 
    validates_attachment_presence :pic, :message => "can't be blank" 
    validates_attachment_content_type :pic, :content_type => ["foo", "bar"] 
end 


# your active record 
class AlbumPhotoFile < ActiveRecord::Base 
    include DefaultPaperclip 
end 

pense que cela devrait fonctionner. Pas testé cependant!

+0

Je vais l'essayer quand je reviens au travail, merci de l'entrée ! – Dr1Ku

+0

Certains autres éléments du module ont également dû être inclus, j'ai inclus la solution de travail ci-dessous. Merci pour votre participation ! – Dr1Ku

Questions connexes