С Carrierwave и Rails 3 возможно ли красиво управлять файлами изображений и не изображениями с помощью одного и того же загрузчика? - PullRequest
7 голосов
/ 04 мая 2011

В моем приложении на Rails я бы хотел, чтобы пользователи могли загружать файлы изображений или не изображения через Carrierwave.В настоящее время Carrierwave прекрасно обрабатывает и обрабатывает файлы изображений, но, к сожалению, полностью удаляет файлы, не относящиеся к изображениям.Существует ли чистый способ для одного загрузчика Carrierwave обрабатывать как файлы изображений, так и не изображения?

Я включу мой текущий загрузчик ниже:

class AssetUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb do
   process :resize_to_fill => [300, 300]
  end

  version :icon do
   process :resize_to_fill => [48, 48]
  end

  def extension_white_list
    %w(jpg jpeg gif png pdf doc xls docx xlsx ppt)
  end

end

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

У меня была именно эта проблема.Я решил эту проблему с помощью решения hoary comp sci с еще одним уровнем косвенности: методом батута / thunk, который динамически решает, обрабатывать ли его на основе расширения файла.

Вы можете найти реализацию здесь: https://gist.github.com/995663

(наивный подход введения логики в блок версии фактически не работает из-за того, как работает CarrierWave DSL - логику нужно отложить до вызова)

Я надеюсь, чтопомогает.

1 голос
/ 23 сентября 2011

Я знаю, что на этот вопрос ответили, но ответ Аарона не полностью решает проблему.Вы можете использовать то, что он предложил в https://gist.github.com/995663, если вам нужно только позвонить process, но не если вы хотите выборочно обрабатывать с version.

Для версии, см. Вики-страницу carrierwaveздесь: https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing

Теперь вы можете сделать это в своем коде, и он будет обрабатывать блок версий только для изображений

version :thumb, :if => :image? do
  process ...
end

protected

def image?(new_file)
  new_file.content_type.include? 'image'
end
...