Я сталкивался с этим, и это выглядит как пример того, как решить эту проблему: https://gist.github.com/995663.
Загрузчик сначала загружается при вызове mount_uploader
, после чего такие вещи, какif image?
или elsif video?
не будет работать, потому что файл для загрузки еще не определен.Вам нужно будет вызывать методы, когда вместо этого создается экземпляр класса.
То, что я сделал по приведенной выше ссылке, переписывает метод process
, так что он принимает список расширений файлов и обрабатывает их, только если ваш файл соответствует одному из этих расширений
# create a new "process_extensions" method. It is like "process", except
# it takes an array of extensions as the first parameter, and registers
# a trampoline method which checks the extension before invocation
def self.process_extensions(*args)
extensions = args.shift
args.each do |arg|
if arg.is_a?(Hash)
arg.each do |method, args|
processors.push([:process_trampoline, [extensions, method, args]])
end
else
processors.push([:process_trampoline, [extensions, arg, []]])
end
end
end
# our trampoline method which only performs processing if the extension matches
def process_trampoline(extensions, method, args)
extension = File.extname(original_filename).downcase
extension = extension[1..-1] if extension[0,1] == '.'
self.send(method, *args) if extensions.include?(extension)
end
Затем вы можете использовать это для вызова того, что раньше обрабатывалось
IMAGE_EXTENSIONS = %w(jpg jpeg gif png)
DOCUMENT_EXTENSIONS = %(exe pdf doc docm xls)
def extension_white_list
IMAGE_EXTENSIONS + DOCUMENT_EXTENSIONS
end
process_extensions IMAGE_EXTENSIONS, :resize_to_fit => [1024, 768]
Для версий в wiki-странице carrierwave есть страница, которая позволяет вам условно обрабатывать версии, если вы находитесь на> 0.5.4,https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing. Вам придется изменить код версии, чтобы он выглядел так:
version :big, :if => :image? do
process :resize_to_limit => [160, 100]
end
protected
def image?(new_file)
new_file.content_type.include? 'image'
end