Динамические стили 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 ответа
Из того, что я вижу, важен порядок параметров. Я имел:
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 || {} }
работал отлично. Надеюсь это поможет.
Спасибо за ответ!
Я боролся с этим уже несколько недель. Я использую Paperclip с FFMPEG для создания эскизов загруженных видео. У меня есть возможность установить, какой кадр использовать в качестве эскиза.
Я также использую вложенную форму (удивительные вложенные формы) для загрузки своих активов. Поэтому я установил параметр времени кадра перед кнопкой просмотра файлов. Это решило проблему для меня, так как я не использую строитель.