在对象初始化之前调用的Paperclip动态Proc样式

时间:2011-04-01 04:26:36

标签: ruby-on-rails styles paperclip initializer proc-object

我有以下回形针设置。会发生什么是我使用proc设置各种样式的大小。但是,在新的和超级调用期间调用proc。我走过调试器,它似乎首先处理:photo参数,所以它初始化附件并调用样式proc,此时实际对象(Photo)尚未被传入的参数(特别是photo.gallery_id)初始化因此它没有正确设置样式。我甚至尝试过重新处理,但没有帮助。我花了几天时间就此而且仍然没有运气。感谢任何帮助!

class Photo < ActiveRecord::Base
  has_and_belongs_to_many :staffs
 has_attached_file :photo, 
                    :storage => :s3,
                    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
                    :path => "/assets/:id/:class/:style/:image_name.:extension",
                    :url => "/assets/:id/:class/:style/:image_name.:extension",
                    :styles => Proc.new { |clip| clip.instance.attachment_styles}

  def attachment_styles
    if self.gallery.nil?
        { :original => {
                        :processors => [:watermark],
                        :geometry =>"600x800!",
                        :watermark_path => ':rails_root/public/images/watermark.png',
                        :position => 'SouthEast'},
          :thumbnail => {
                        :processors => [:watermark],
                        :geometry => "200x300!",
                        :watermark_path => ':rails_root/public/images/watermark.png',
                        :position => 'SouthEast'}
        }
    elsif self.photo.styles.empty?
        gallery_type = GalleryType.find_by_id(self.gallery_id)
        { :original => {
                        :processors => [:watermark],
                        :geometry =>"#{gallery_type.width_max}x#{gallery_type.height_max}!",
                        :watermark_path => ':rails_root/public/images/watermark.png',
                        :position => 'SouthEast'},
          :thumbnail => {
                        :processors => [:watermark],
                        :geometry => "#{gallery_type.width_min}x#{gallery_type.height_min}!",
                        :watermark_path => ':rails_root/public/images/watermark.png',
                        :position => 'SouthEast'}
        }
    else
        self.photo.styles
    end
  end


  def reprocess_att
    self.photo.reprocess!
  end

  def initialize(galleryid, params = {}) 
    begin
        param.merge!({"gallery_id" => galleryid.to_s})
        super(params)
    rescue => e
      puts e.message()
    end
  end

2 个答案:

答案 0 :(得分:1)

从我所看到的,参数的顺序很重要。我有:

attachments.build(:upload => File.new(File.dirname(__FILE__) + '/../fixtures/test-image.jpg'),                                                                                                                                                                                               
:styles => {:small => ['100x100#', :jpg], :medium => ['250x250', :jpg]})

这并没有正确设置样式。他们只是零。我改成了:

attachments.build(:styles => {:small => ['100x100#', :jpg], :medium => ['250x250', :jpg]},                                                                                                                                                                                               
:upload => File.new(File.dirname(__FILE__) + '/../fixtures/test-image.jpg'))

然后是代码:

:styles => lambda { |a| a.instance.styles || {} }

工作得很好。希望这会有所帮助。

答案 1 :(得分:0)

感谢您的回答!

我已经和它斗争了几个星期了。我正在使用Paperclip和FFMPEG制作上传视频的缩略图。我可以选择设置要用作缩略图的帧。

我也在使用嵌套表单(很棒的嵌套表单)进行资产上传。 所以我所做的就是在文件浏览按钮之前放置帧时间参数。这解决了我的问题,因为我没有使用构建器。