2011-06-20 30 views
5

Tôi có hình mờ, phòng trưng bày và mô hình ảnh.Làm thế nào để vượt qua một con đường watermark biến đến một bộ xử lý watermark kẹp giấy?

Gallery belongs_to Watermark Ảnh belongs_to Gallery

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 

Với điều này tôi nhận được undefined local variable or method 'gallery'. Nếu tôi cố gắng như thế này với :gallery_watermark_path được xác định bằng cách sử dụng Paperclip.interpolations nó âm thầm không thành công.

:watermark_path => ":gallery_watermark_path" 

Các :gallery_watermark_path không được xử lý bởi 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 

Nói tóm lại, làm thế nào để tôi vượt qua những biến watermark vào bộ vi xử lý?

Trả lời

0

Bạn có thể sử dụng một proc cho phong cách:

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

Nhưng đôi khi, các proc được gọi trước khi dụ được tất cả các thuộc tính của nó (vì vậy đôi khi gallery có thể nil bởi vì bạn có thể đã gán image trước gallery_id) .

+0

Đã xác nhận, các thuộc tính như ('gallery_id'), không được gán để tệp đính kèm.instance.gallery xuất hiện dưới dạng nil. – cevaris

0

Các watermark_path cần phải là một tên đường dẫn, cố gắng sử dụng Rails.root.join như thế này:

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

Tôi hy vọng rằng sẽ giúp bạn,

cổ vũ.

Các vấn đề liên quan