проблема обратного вызова с несущей волной и монгоидом - PullRequest
6 голосов
/ 18 марта 2011

Я использую carrierwave и mongoid в приложении rails 3, и у меня возникла проблема с обратным вызовом after_save.Рассмотрим следующее

class Video
  include Mongoid::Document

  field :name  

  mount_uploader :file, VideoUploader

  after_create :enqueue_for_encoding

  protected

  def enqueue_for_encoding
     // point your encoding service to where it expects the permanent file to reside
     // in my case on s3 
  end

end

Моя проблема заключается в том, что в моем методе enqueue_for_encoding file.url указывает на локальный каталог tmp, а не на каталог s3.

Как получить enqueue_for_encoding метод, который вызывается, когда file.url указывает на s3?

Спасибо!

Джонатан

Ответы [ 4 ]

2 голосов
/ 04 января 2012

Посетите страницу с инструкциями на WRB на Callbacks

https://github.com/jnicklas/carrierwave/wiki/How-to%3A-use-callbacks

Это сработало для меня

1 голос
/ 03 июня 2017

Возможно установить обратный вызов enqueue_for_encoding на самом загрузчике.Но я предпочитаю делать это так:

class Video
  # mount the uploader first:
  mount_uploader :file, VideoUploader
  # then add the callback:
  after_save :enqueue_for_encoding, on: :create
end
1 голос
/ 21 марта 2011

Хорошо, я понял это.Чтобы немного взломать.Таким образом, в настоящее время carrierwave не предоставляет хук after_create, все это сохраняется и обработка происходит в обратном вызове after_save.Вот код, который я использовал для обхода:

# Video.rb

  mount_uploader :file, VideoUploader

  # overwrite the file setting to flag the model that we are creating rather than saving
  def file=(obj)
    @new_file = true
    super(obj)
  end

  # chain the store_file! method to enqueue_for_encoding after storing the file AND
  # if the file is new
  alias_method :orig_store_file!, :store_file!
  def store_file!
    orig_store_file!
    if @new_file #means dirty
      @new_file = false
      enqueue_for_encoding
    end
    true
  end

ОБНОВЛЕНИЕ

Woops - это не сработало.Это почти сделал - URL-адрес правильный, но он увольняется постоянно.Это означает, что файл все еще находится в процессе загрузки и не полностью сохраняется, когда enqueue_for_encoding называется

0 голосов
/ 20 марта 2011

Вы можете попробовать удалить свой обратный вызов after_create в модели и добавить следующее к своему загрузчику:

# video_uploader.rb

process :encode

def encode
  model.enqueue_for_encoding
end

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

...