如何将可变水印路径传递给回形针水印处理器?

我有水印,画廊和照片模型。

Gallery belongs_to Watermark Photo belongs_to Gallery

 class Photo  [: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 

有了这个我得到undefined local variable or method 'gallery' 。 如果我这样尝试:gallery_watermark_path使用Paperclip.interpolations定义:gallery_watermark_path它会无声地失败。

 :watermark_path => ":gallery_watermark_path" 

:gallery_watermark_path不处理:gallery_watermark_path

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] 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 

简而言之,如何将水印变量传递给处理器?

您可以为样式使用proc:

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

但有时,在实例获取其所有属性之前调用proc(因此有时gallery可能为nil因为您可能在gallery_id之前分配了image )。

watermark_path需要是一个Pathname,尝试使用Rails.root.join,如下所示:

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

我希望能帮助你,

干杯。