2012-10-03 21 views
6

Paperclip proporciona un método .url para obtener la URL de un archivo adjunto para su inclusión en una vista.¿Cuál es la forma estándar/correcta para abrir un archivo adjunto de clip dentro de Ruby?

Necesito abrir realmente un archivo adjunto como un archivo desde dentro de Ruby.

Hace aproximadamente seis meses, la última revisión de Paperclip nos permitió llamar a_archivo en el objeto de archivo adjunto. Aunque no estaba documentado, funcionó de manera consistente. Pero en algún momento dejó de funcionar.

Quiero poder abrir el archivo desde un validador (en cuyo caso no se ha guardado aún en su ubicación final) o desde un método completamente distinto después de que se haya guardado el objeto ActiveModel (en cuyo caso el archivo se movió a su ubicación final, que podría estar en Amazon S3).

Parece que las opciones son:

file = File.new(object.attachment.path) 

... que sólo funciona con archivos locales, no los de S3. O:

file = object.attachment.queued_for_write[:original] 

... que sólo funciona antes de que el primer salvamento (creo)?

Parece que debería haber una forma sencilla de abrir el archivo (que, en el caso de Amazon S3, podría implicar copiarlo en una ubicación temporal) y supongo que la respuesta tiene algo que ver con los io_adapters, pero he leído el código (y bastantes preguntas de StackOverflow) y todavía estoy perplejo.

¿Existe una manera estándar de abrir un archivo adjunto de clip como un archivo que funciona en todos los casos?

Respuesta

4

Esto obtendrá el archivo (suponiendo yourmodel adjunta un file

require 'open-uri' 

file = open(yourmodel.file.url) 
+1

¿No se requiere que el archivo ya está guardado? La forma correcta debe trabajar cuando el archivo es temp. – DDDD

+2

Esto no significa funciona cuando el archivo no está en S3, por ejemplo, dev vs. prod. – user1032752

Cuestiones relacionadas