2010-08-19 18 views
5

Ich benutze Büroklammer für Anlagen für mehrere Modelle mit accesses_nested_attributes_for. Gibt es eine Möglichkeit, für jedes Modell bestimmte Optionen für den Büroklammerstil anzugeben?Rails Paperclip polymorphe Stile

Antwort

10

Ja. Ich verwende Single Table Vererbung (STI) auf Websites für die Verarbeitung von Audio-, Video- und Bilddateien über ein Asset-Modell.

# models/Asset.rb 
class Asset < ActiveRecord::Base 
    # Asset has to exist as a model in order to provide inheritance 
    # It can't just be a table in the db like in HABTM. 
end 

# models/Audio.rb 
class Audio < Asset # !note inheritance from Asset rather than AR! 
    # I only ever need the original file 
    has_attached_file :file 
end 

# models/Video.rb 
class Video < Asset 
    has_attached_file :file, 
    :styles => { 
     :thumbnail => '180x180', 
     :ipod => ['320x480', :mp4] 
     }, 
    :processors => "video_thumbnail" 
end 

# models/Image.rb 
class Image < Asset 
    has_attached_file :file, 
    :styles => { 
     :medium => "300x300>", 
     :small => "150x150>", 
     :thumb => "40x40>", 
     :bigthumb => "60x60>" 
    } 
end 

Sie sind alle in Rails als :file, aber die Steuerung (A/V/I) weiß auf das richtige Modell zu speichern. Denken Sie daran, dass alle Attribute für eine der Medienformen in Asset enthalten sein müssen: Wenn das Video keine Bildunterschriften, aber Bilder benötigt, dann ist das Attribut caption für Video null. Es wird sich nicht beschweren.

Assoziationen funktionieren auch gut, wenn sie an die STI-Modelle angeschlossen sind. User has_many :videos funktioniert genauso wie Sie es jetzt verwenden, stellen Sie nur sicher, dass Sie nicht versuchen, direkt in Asset zu speichern.

Schließlich, da Sie ein Asset-Modell haben, können Sie immer noch direkt daraus lesen, wenn z. Sie möchten eine Liste der 20 neuesten Assets. Außerdem ist dieses Beispiel nicht auf das Trennen von Medientypen beschränkt, es kann für verschiedene Arten der gleichen Sache ebenso verwendet werden: Avatar < Asset, Galerie < Asset und so weiter.

+2

Wo legen Sie fest, wo die Datei gespeichert wird? Auf dem Asset-Modell? Oder ist das Asset-Modell leer? sagen: ': Speicher =>: s3, : Eimer => Rails.application.config.aws_s3_bucket, : s3_credentials =>" # {Schienen.root} /config/s3.yml ", : Pfad =>": class /: id /: style /: basename.: extension "' –

+0

Ich benutze einfach den Standardwert und lasse das Asset-Modell leer, aber ich wette, dass es eine Möglichkeit gibt, im Asset-Modell eine Standardeinstellung festzulegen. Ich habe es nicht versucht. – Eric

2

Ein viel nicer Weg sein kann, (wenn die Verwendung mit Bildern zu tun):

class Image < ActiveRecord::Base 
    belongs_to :imageable, :polymorphic => true 
    has_attached_file :attachment, styles: lambda { 
    |attachment| { 
     thumb: ( 
     attachment.instance.imageable_type.eql?("Product") ? ["300>", 'jpg'] : ["200>", 'jpg'] 
    ), 
     medium: ( 
     ["500>", 'jpg'] 
    ) 
    } 
    } 
end 
+0

Funktioniert Ihre Antwort wirklich? attachment.instance.imageable_type ist null –

+0

@ArtemAminov Ja, es funktioniert .. wie ich es in einem meiner Projekte verwende. –

+0

vielleicht kannst du mir bei meinem Projekt helfen, siehe Code hier [link] (http://stackoverflow.com/questions/19901485/paperclip-polymorphic-styles) –

Verwandte Themen