Вопрос

Раньше: запуск метода модели в приложении скрепки после создания или обновления (обратные вызовы PaperClip, похоже, не работают)

Редактировать (позже в тот же день)Я понял свою проблему. Процессор, по -видимому, работает с обновлением файла, но не сохраняет никаких файлов до после обработки. Я изменил свой Zip :: Zipfile, чтобы открыть «файл», а не «Adathment.path», так как путь вложения на самом деле ничего не держит. Это исправило первую проблему. Теперь у меня есть другие проблемы, которые мне понадобятся. Но ответ ниже в основном правильный.

Изменить (31.01.2011):

Поэтому я принял совет, чтобы создать процессор для моего вложения, который выполнит все необходимые действия. До сих пор похоже, что это должно работать; Процессор начинает и делает все вещи инициализации, по -видимому. Однако, когда я получаю точку, когда я хочу получить доступ к файлу ZIP, который загружается, я получаю ошибку, говоря, что файл не может быть найден. Код для моего процессора ниже:

class Extractor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
      @instance = attachment.instance
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with
      export_path = attachment.path.gsub('.zip', '_content')

      Zip::ZipFile.open(attachment.path) { |zip_file|
        zip_file.each { |image|
          image_path = File.join(export_path, image.name)
          FileUtils.mkdir_p(File.dirname(image_path))
          unless File.exist?(image_path)
            zip_file.extract(image, image_path)
            # ..stuff that it does..
          end
        }
      }
      # clean up source files, but leave the zip
      FileUtils.remove_dir(export_path)


      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
end

И вот содержимое ошибки, которую я получаю:

Zip::ZipError in GalleriesController#create

File /home/joshua/railscamp/moments_on_three/public/assets/archives/delrosario.zip not found

Rails.root: /home/joshua/railscamp/moments_on_three
Application Trace | Framework Trace | Full Trace

config/initializers/extractor.rb:16:in `make'
app/controllers/galleries_controller.rb:32:in `new'
app/controllers/galleries_controller.rb:32:in `create'

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"0s4L4MrlqjDTMjzjgkUdvUxeHklZNOIShDhT6fgOICY=",
 "gallery"=>{"name"=>"DelRosario",
 "public"=>"0",
 "owner_id"=>"1",
 "shoot_date(1i)"=>"2011",
 "shoot_date(2i)"=>"1",
 "shoot_date(3i)"=>"31",
 "category_id"=>"1",
 "archive"=>#<ActionDispatch::Http::UploadedFile:0x00000004148d78 @original_filename="delrosario.zip",
 @content_type="application/zip",
 @headers="Content-Disposition: form-data; name=\"gallery[archive]\"; filename=\"delrosario.zip\"\r\nContent-Type: application/zip\r\n",
 @tempfile=#<File:/tmp/RackMultipart20110131-9745-14u347v>>},
 "commit"=>"Create Gallery"}

Из того, что я могу сказать, он ищет файл в нужном месте, но файл, похоже, еще не загружен для его доступа. Насколько мне известно, Paperclip достаточно умна, чтобы знать, и ждать загрузки вложения, прежде чем он попытается его обработать. Кто -нибудь может заметить, что я делаю здесь не так?

Большое спасибо.

Старые вещи:

Я разрабатываю приложение для фотогалереи, используя Rails 3 и Paperclip. Администратор может создать галерею и загружать zip -файл, содержащий кучу изображений.

Что я хочу случиться:

  1. Введите информацию о галерее и zip -файл, чтобы загрузить в форму.
  2. Нажмите кнопку «Создать галерею».
  3. Формические сообщения, галерея сохраняется, и zip -файл загружается.
  4. После того, как ZIP -файл загружен, запустите метод: extract_photos (кстати, этот код работает). 4.A. В конце этого метода zip -файл уничтожен.
  5. Администратор перенаправляется на страницу галереи со всеми фотографиями в ней (где галерея Has_many Photos).

Я пытался сделать эту работу несколько разных способов.

Раньше я создал метод контроллера, который позволил бы администратору щелкнуть ссылку, которая запустила метод: extract_photos. Это работало на моем компьютере, но по какой -то причине у сервера были проблемы с маршрутизацией этого на компьютере клиента. Так что это не идти. Плюс я думал, что это был уродливый способ сделать это.

Недавно я попытался использовать методы обратного вызова. After_save не работал, потому что, по -видимому, прерывает сообщение о форме, и файл не загружается, а метод: extract_photos не может найти файл.

Я проверил методы обратного вызова на странице Github Pacerlip, и в нем говорится о обратных вызовах:

До и после шага после обработки обработки обратно обратно на модель с несколькими обратными вызовами, что позволяет модели изменять или отменить шаг обработки. Образцы являются «перед_Пост_процесс» и «adper_post_process» (которые вызываются до и после обработки каждого вложения), а также специфичный для приложения «перед phorpost_process» и «Afterpost_process». Обратные вызовы предназначены как можно ближе к нормальным обратным вызовам Activerecord, поэтому, если вы вернете false (в частности - возвращение NIL не совпадает) в фильтре, шаг после обработки остановится. Возвращение false в после фильтра ничего не остановит, но вы можете получить доступ к модели и вложению, если это необходимо.

Я попытался использовать до_Пост -_процесс и After_post_process, но он не может найти файл для запуска процесса, поэтому файл, очевидно, не загружается к тому времени, когда эти методы получают (что, я думаю, странно). Кроме того, когда я попробую перед Post_process и Afterpost_process, я получаю нометодеррок.

Итак, как мне вызвать метод на вложении, когда он создается или обновляется, но после загрузки файла и в нужном месте?

ОБНОВИТЬ

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

Это было полезно?

Решение

Вы можете написать свой собственный процессор для этого.

В вашей модели при объявлении материала скрепки добавьте пользовательский процессор

  has_attached_file :my_attachment, {
    :styles => {:original => {:processors => [:my_processor]}}
  }.merge(PAPERCLIP_SETTINGS)

Затем напишите свой собственный процессор и положите его на конфигурацию/инициализаторы:

module Paperclip
  class MyProcessor < Processor
    attr_accessor :resolution, :whiny
    def initialize(file, options = {}, attachment = nil)
      super
      @file = file
      @whiny = options[:whiny].nil? ? true : options[:whiny]
      @basename = File.basename(@file.path, File.extname(@file.path))
      @attachment = attachment
    end
    def make
      # do your conversions here, you've got @file, @attachment and @basename to work with

      # you return a file handle which is the processed result
      dst = File.open result_file_path
    end
  end
end

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top