2011-03-18 14 views
6

Estoy usando carrierwave y mongoid en una aplicación de rails 3 y estoy teniendo un problema con una devolución de llamada after_save. Consideremos el siguienteproblema de devolución de llamada con carrierwave y mongoid

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 

Mi problema es que en mi método enqueue_for_encoding, file.url puntos en el directorio tmp local no el directorio s3.

¿Cómo puedo llamar a mi método enqueue_for_encoding cuando file.url apunta a s3?

Gracias!

Jonathan

Respuesta

0

Usted podría tratar de retirar a su after_create de devolución de llamada en el modelo y añadir lo siguiente a su subida por

# video_uploader.rb 

process :encode 

def encode 
    model.enqueue_for_encoding 
end 

Los process devoluciones de llamada se llaman después se guarda el archivo (creo) que debería permitirle enganchar una vez que su archivo está en S3.

+1

Gracias por el comentario, pero no funcionó, incluso la devolución de llamada del proceso apunta al archivo temporal. – Jonathan

+0

Maldita sea. Eso es realmente molesto ¿Podría usar un trabajo cron en su aplicación para barrer su cubo/directorio S3 para trabajos no procesados ​​y agregarlos a la cola de esa manera? No es tan elegante, pero debería funcionar de manera confiable. – theTRON

1

Bien, lo descubrí. Para tomó un poco de piratería. Por lo tanto, actualmente carrierwave no expone un hook after_create, todo persiste y el procesamiento ocurre en la devolución de llamada after_save. Aquí está el código que solía trabajar alrededor de ella:

# 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 

ACTUALIZACIÓN

Woops - que no funcionó. Casi lo hizo: la URL es correcta, pero se está disparando de forma permanente. Es decir, el archivo se encuentra todavía en proceso de ser cargado, y no se almacena completamente cuando se llama enqueue_for_encoding

1

Es es posible configurar su devolución de llamada enqueue_for_encoding en el cargador. Pero prefiero hacerlo de esta manera:

class Video 
    # mount the uploader first: 
    mount_uploader :file, VideoUploader 
    # then add the callback: 
    after_save :enqueue_for_encoding, on: :create 
end 
Cuestiones relacionadas