Динамические стили Proc скрепки, вызываемые до инициализации объекта - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть следующие настройки скрепки. Что происходит, так это то, что я использую процедуру для установки размеров для различных стилей. Тем не менее, процесс вызывается по новому и во время супер-вызова. Я прошелся по отладчику, и похоже, что он сначала обрабатывает параметр: 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 ]

1 голос
/ 29 декабря 2011

Из того, что я вижу, важен порядок параметров. У меня было:

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 || {} }

работал отлично. Надеюсь, это поможет.

0 голосов
/ 08 августа 2012

Спасибо за ответ!

Я боролся с этим уже несколько недель. Я использую Paperclip с FFMPEG для создания эскизов загруженных видео. У меня есть возможность указать, какой кадр использовать в качестве эскиза.

Я также использую вложенную форму (удивительные вложенные формы) для загрузки своих активов. Итак, я установил параметр времени кадра перед кнопкой просмотра файлов. Это решило проблему для меня, так как я не использую Builder.

...