Почему Paperclip не может найти ключ геометрии на моем сервере? - PullRequest
1 голос
/ 23 июля 2010

Я получаю сообщение об ошибке в thumbnail.rb, говорящее: геометрия пуста

Вот сокращенная версия стека:

NoMethodError in PagesController#create

undefined method `[]' for nil:NilClass

RAILS_ROOT: ...
Application Trace | Framework Trace | Full Trace

.../vendor/plugins/paperclip/lib/paperclip/thumbnail.rb:18:in `initialize'
.../vendor/plugins/paperclip/lib/paperclip/processor.rb:33:in `new'
.../vendor/plugins/paperclip/lib/paperclip/processor.rb:33:in `make'
.../vendor/plugins/paperclip/lib/paperclip/attachment.rb:295:in `post_process_styles'
.../usr/lib/ruby/1.8/erb.rb:719:in `inject'
....

Я нахожу довольно странным то, что он отлично работает на моей локальной машине, а не время от времени на моем сервере.

Мой файл has_attached_file выглядит так:

  has_attached_file :foreground,
                    :storage => :s3,
                    :s3_credentials => "#{RAILS_ROOT}/config/amazon_s3.yml",
                    :bucket => 'recurse',
                    :path => ":attachment/:id_partition/:token/:style/:filename",
                    :styles => {
                      :medium => {:geometry => '372x251>'},
                      :small => {:geometry => '188x156>'},
                      :original_strip => {:geometry => '100x100%', :processors => [:Cropper]},
                      :medium_strip => {:geometry => '100x100%', :processors => [:MediumCropper]},
                      :small_strip => {:geometry => '100x100%', :processors => [:SmallCropper]},
                    }

  has_attached_file :background,
                    :storage => :s3,
                    :s3_credentials => "#{RAILS_ROOT}/config/amazon_s3.yml",
                    :bucket => 'recurse',
                    :path => ":attachment/:id_partition/:token/:style/:filename",
                    :styles => {
                      :medium => {:geometry => '372x251>'},
                      :small => {:geometry => '188x156>'}
                    }

И на thumbnail.rb: 18 есть @crop ...

  geometry             = options[:geometry]
  @file                = file
  @crop                = geometry[-1,1] == '#'
  @target_geometry     = Geometry.parse geometry
  @current_geometry    = Geometry.from_file @file

Любая помощь была бы чрезвычайно полезной, поскольку я не смог найти ничего, что исправит это в Google. Вот еще и проблема с github , если вы хотите ответить вместо этого / как

Ответы [ 2 ]

0 голосов
/ 21 октября 2010

Эта проблема исправлена ​​в 2.3.4.

Вот соответствующее изменение:

@@ -55,7 +57,7 @@
       unless @normalized_styles
         @normalized_styles = {}
         (@styles.respond_to?(:call) ? @styles.call(self) : @styles).each do |name, args|
-          @normalized_styles[name] = Paperclip::Style.new(name, args, self)
+          @normalized_styles[name] = Paperclip::Style.new(name, args.dup, self)
         end
       end
       @normalized_styles

Вот что я думаю происходит до 2.3.4 и почему это изменение решает проблему:

В разработке кэширование классов обычно отключено, а в производственной - нет. Обратите внимание, что единственным изменением выше является args -> args.dup. Style#initialize, используя Hash#delete, изменял исходные аргументы для стиля, а не для копии. Первое обработанное изображение получило все аргументы, в то время как более поздние изображения не получили, потому что Style#initialize удалил ключ из опций Hash.

Ссылка на публикацию в Группе Google также устранила проблему, поскольку вместо изменения оригинального хэша используется Hash#reject, который возвращает копию хэша с удаленными ключами. Это решает проблему по существу таким же образом, но с большим изменением кода.

0 голосов
/ 24 июля 2010

Style.rb строки 18-21 должны быть:

    @geometry = definition[:geometry]
    @format = definition[:format]
    @processors = definition[:processors]
    @other_args = definition.reject {|key,value|[:geometry, :format, :processors].include?(key)}

http://groups.google.com/group/paperclip-plugin/browse_thread/thread/c2f5a7ae58fff976

...