2011-06-20 13 views
5

Tengo marcas de agua, galerías y modelos de fotos.¿Cómo paso una ruta de marca de agua variable a un procesador de marca de agua de clip?

Galería de fotos belongs_to Marca de agua belongs_to Galería

class Photo < ActiveRecord::Base 
    before_save :save_dimensions, :set_orientation 
    belongs_to :gallery 

    has_attached_file :image, 
    :processors => [:watermark], 
    :styles => { 
     :thumbnail => ["80x80>"], 
     :small => { 
     :geometry => "200x200>", 
     :watermark_path => "#{gallery.watermark.image.path(:small)}", 
     :position => "Center" 
     }, 
     :medium => { 
     :geometry => "400x400>", 
     :watermark_path => "#{gallery.watermark.image.path(:medium)}", 
     :position => "Center" 
     }, 
     :large => { 
     :geometry => "600x600>", 
     :watermark_path => "#{gallery.watermark.image.path(:large)}", 
     :position => "Center" 
     } 
    }, 
    :path => ":rails_root/public/images/galleries/:gallery_id/:id/:style_:basename.:extension", 
    :url => "galleries/:gallery_id/:id/:style_:basename.:extension" 
    validates_attachment_presence :image 
    validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png'] 
    attr_protected :image_file_name, :image_content_type, :image_file_size 

end 

Con esto consiguen undefined local variable or method 'gallery'. Si intento así con :gallery_watermark_path definido usando Paperclip.interpolations, falla silenciosamente.

:watermark_path => ":gallery_watermark_path" 

El :gallery_watermark_path no consigue procesados ​​por Paperclip.interpolations:

development.log:

[paperclip] identify -format %wx%h '/tmp/stream20110620-30644-1j6i9in.jpg[0]' 2>/dev/null 
[paperclip] convert '/tmp/stream20110620-30644-1j6i9in.jpg' '-resize' '80x80>' '-auto-orient' '/tmp/stream20110620-30644-1j6i9in20110620-30644-1mcqvox' 2>/dev/null 
[paperclip] identify -format %wx%h '/tmp/stream20110620-30644-1j6i9in.jpg[0]' 2>/dev/null 
[paperclip] convert '/tmp/stream20110620-30644-1j6i9in.jpg' '-resize' '200x200>' '-auto-orient' '/tmp/stream20110620-30644-1j6i9in20110620-30644-60zlb' 2>/dev/null 
[paperclip] composite '-gravity' 'Center' ':gallery_watermark_path' '/tmp/stream20110620-30644-1j6i9in20110620-30644-60zlb' '/tmp/stream20110620-30644-1j6i9in20110620-30644-60zlb' 2>/dev/null 
[paperclip] An error was received while processing: #<Paperclip::PaperclipError: There was an error processing the watermark for stream20110620-30644-1j6i9in> 
[paperclip] identify -format %wx%h '/tmp/stream20110620-30644-1j6i9in.jpg[0]' 2>/dev/null 
[paperclip] convert '/tmp/stream20110620-30644-1j6i9in.jpg' '-resize' '400x400>' '-auto-orient' '/tmp/stream20110620-30644-1j6i9in20110620-30644-1ronidq' 2>/dev/null 
[paperclip] identify -format %wx%h '/tmp/stream20110620-30644-1j6i9in.jpg[0]' 2>/dev/null 
[paperclip] convert '/tmp/stream20110620-30644-1j6i9in.jpg' '-resize' '600x600>' '-auto-orient' '/tmp/stream20110620-30644-1j6i9in20110620-30644-1ikfy72' 2>/dev/null 

En pocas palabras, ¿cómo pasa la variable de marca de agua para el procesador?

Respuesta

0

Se puede usar un proc de los estilos:

has_attached_file :image, 
    :processors => [:watermark], 
    :styles => proc { |attachment| 
     { 
     :thumbnail => ["80x80>"], 
     :small => { 
      :geometry => "200x200>", 
      :watermark_path => attachment.instance.gallery.watermark.image.path(:small), 
      :position => "Center" 
     }, 
     :medium => { 
      :geometry => "400x400>", 
      :watermark_path => attachment.instance.gallery.watermark.image.path(:medium), 
      :position => "Center" 
     }, 
     :large => { 
      :geometry => "600x600>", 
      :watermark_path => attachment.instance.gallery.watermark.image.path(:large), 
      :position => "Center" 
     } 
     } 
    }, 
    [...] 

Pero a veces, el proc se llama antes de la instancia obtener todos sus atributos (lo que a veces gallery pueden ser nil ya que puede haber asignado image antes gallery_id) .

+0

Confirmado, los atributos como ('gallery_id') no están asignados, por lo que attachment.instance.gallery aparece como nil. – cevaris

0

El watermark_path necesario que haya un nombre de ruta, tratar de utilizar Rails.root.join así:

has_attached_file :image, 
:processors => [:watermark], 
:styles => { 
    :thumbnail => ["80x80>"], 
    :small => { 
    :geometry => "200x200>", 
    :watermark_path => Rails.root.join("#{gallery.watermark.image.path(:small)}") 
    :position => "Center" 
    }, 
    :medium => { 
    :geometry => "400x400>", 
    :watermark_path => Rails.root.join("#{gallery.watermark.image.path(:medium)}") 
    :position => "Center" 
    }, 
    :large => { 
    :geometry => "600x600>", 
    :watermark_path => Rails.root.join("#{gallery.watermark.image.path(:large)}"), 
    :position => "Center" 
    } 
} 
[...] 

espero que le ayuda,

aplausos.

Cuestiones relacionadas