Переопределение content_type для плагина Скрепки направляющих

Я думаю, что у меня есть определенная проблема курицы и яйца. Я хотел бы установить content_type файла, загруженного через Скрепку. Проблема состоит в том, что значение по умолчанию content_type только основано на расширении, но я хотел бы основывать его на другом модуле.

Я, кажется, могу установить content_type с before_post_process

class Upload < ActiveRecord::Base 
  has_attached_file :upload
  before_post_process :foo

  def foo
    logger.debug "Changing content_type"

    #This works
    self.upload.instance_write(:content_type,"foobar")

    # This fails because the file does not actually exist yet
    self.upload.instance_write(:content_type,file_type(self.upload.path)
  end

  # Returns the filetype based on file command (assume it works)
  def file_type(path)
    return `file -ib '#{path}'`.split(/;/)[0]
  end
end

Но... Я не могу основывать тип контента на файле, потому что Скрепка не пишет файл до after_create.

И я, может казаться, не устанавливаю content_type после того, как он был сохранен или с after_create обратным вызовом (даже назад в контроллере)

Таким образом, я хотел бы знать, могу ли я так или иначе добраться, доступ к фактическому объекту файла (предположите, что нет никаких процессоров, делающих ничто в исходный файл), прежде чем он будет сохранен, так, чтобы я мог выполнить команду file_type на этом. Или есть ли способ изменить content_type после того, как объекты были созданы.

6
задан Fotios 6 April 2010 в 13:35
поделиться

1 ответ

Возможно, вы могли бы использовать upload.to_file . Это дает вам временный файл скрепки ( Paperclip :: Tempfile ). Он имеет свойство path , поэтому вы можете использовать

self.upload.instance_write(:content_type,file_type(self.upload.to_file.path)

Вы можете получить Tempfile , используя upload.to_file.to_tempfile

4
ответ дан 17 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: