2011-06-20 14 views
5

Mam modele znaków wodnych, galerie i zdjęcia.Jak przekazać zmienną ścieżkę znaku wodnego do procesora znakowego spinacza?

Galeria belongs_to Watermark Photo belongs_to Galeria

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 

Z tym mam undefined local variable or method 'gallery'. Jeśli spróbuję tak z :gallery_watermark_path zdefiniowanym przy pomocy Paperclip.interpolations, to po cichu zawiedzie.

:watermark_path => ":gallery_watermark_path" 

:gallery_watermark_path nie zostanie przetworzony przez 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 

W skrócie, w jaki sposób przekazać zmienną znaku wodnego do procesora?

Odpowiedz

0

Można użyć proc dla stylów:

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" 
     } 
     } 
    }, 
    [...] 

Ale Czasami proc jest wywoływana przed instancji dostać wszystkie jego atrybuty (tak czasami gallery może być nil bo możesz mieć przypisany image przed gallery_id) .

+0

Potwierdzone, atrybuty takie jak ('gallery_id'), nie są przypisane, więc attachment.instance.gallery pojawia się jako zero. – cevaris

0

watermark_path musi być Ścieżka, spróbuj użyć Rails.root.join tak:

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" 
    } 
} 
[...] 

Mam nadzieję, że pomaga,

okrzyki.

Powiązane problemy