Можно ли с помощью Carrierwave и Rails 3 удобно управлять файлами изображений и файлов без изображений с помощью одного и того же загрузчика?

В моем приложении 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

person jklina    schedule 03.05.2011    source источник
comment
Я не использовал драгоценный камень CarrierWave, но с Paperclip это довольно тривиально. Глядя на ридми CW, его использование выглядит намного сложнее, чем использование Paperclip. Просто мои $ 0,02   -  person Yardboy    schedule 12.05.2011
comment
Ты прав. В итоге я вернулся к Paperclip, хех.   -  person jklina    schedule 12.05.2011


Ответы (2)


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

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

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

Надеюсь, это поможет.

person aaron    schedule 27.05.2011
comment
Это начало, но неполное, так как все еще создаются версии. Обработки не происходит, но вы получите несколько копий исходного файла. - person keithepley; 23.09.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
person keithepley    schedule 23.09.2011