2010-08-19 14 views
5

Estoy utilizando clip para archivos adjuntos para varios modelos utilizando accept_nested_attributes_for. ¿Hay alguna manera de especificar las opciones de estilo de clip específicas para cada modelo?Rails Paperclip estilos polimórficos

Respuesta

10

Sí. Utilizo herencia de tabla única (STI) en sitios para manejar audio, video e imágenes a través de un modelo de activos.

# 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 

todo entran en Rails como :file, pero el controlador (A/V/I) conoce a guardar en el modelo apropiado. Solo recuerde que todos los atributos para cualquiera de las formas de medios deben incluirse en Asset: si el video no necesita subtítulos pero las imágenes sí lo tienen, entonces el atributo de subtítulos será nulo para Video. No se quejará

Las asociaciones también funcionarán bien si están conectadas a los modelos de STI. User has_many :videos funcionará igual que lo está usando ahora, solo asegúrese de no intentar guardar en el activo directamente.

# controllers/images_controller.rb 
    def create 
    # params[:image][:file] ~= Image has_attached_file :file 
    @upload = current_user.images.build(params[:image]) 
    # ... 
    end 

Por último, ya que tienen un modelo de activo, todavía se puede leer directamente de ella si, por ejemplo, desea una lista de los 20 Activos más recientes. Además, este ejemplo no está restringido a la separación de tipos de medios, sino que también se puede usar para diferentes tipos de lo mismo: avatar <, Galería < activo, y así sucesivamente.

+2

Dónde Cómo se define donde el archivo se guarda? En el modelo de activos? ¿O está el modelo de activos en blanco? say: ': storage =>: s3, : bucket => Rails.application.config.aws_s3_bucket, : s3_credentials =>" # {Rails.root} /config/s3.yml ", : path =>": class /: id /: style /: basename.: extension "' –

+0

Solo uso el valor predeterminado y mantengo el modelo de activos en blanco, pero apuesto a que hay una manera de tener un conjunto predeterminado en el modelo de activos. No lo he intentado. – Eric

2

Una gran parte nicer manera puede ser, (si su uso está tratando con imágenes):

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

¿Su respuesta realmente funciona? attachment.instance.imageable_type is nil –

+0

@ArtemAminov Sí funciona ... como lo estoy usando en uno de mis proyectos. –

+0

tal vez me pueda ayudar con mi proyecto, vea el código aquí [enlace] (http://stackoverflow.com/questions/19901485/paperclip-polymorphic-styles) –

Cuestiones relacionadas