2012-09-07 15 views
5

Necesito poder adjuntar un archivo a un correo (usando Mailer) para un archivo recientemente cargado que no está vinculado a ningún Modelo.Carrierwave Archivo temporal sin modelo

En el código que va para el formulario de carga:

<%= form_for(:mail, :url => {:action => 'send_mail'}, :html => {:multipart => true}) do |f| %> 
<table summary="send_table"> 
    <tr> 
    <th>Attachment</th> 
    <td><%= f.file_field(:attachment) %><a id="attachment"></a></td> 
    </tr> 
</table> 

<%= submit_tag "Send!" %> 

Ahora, lo que estoy buscando para que haga en la acción send_mail es algo así como:

MyMailer.send_mail(params[:mail][:attachment]).deliver 

con params [: mail] [: archivo adjunto] es la ruta al archivo temporal cargado con el formulario. ¿Cómo puede uno hacer eso?

Esto también implica otra pregunta: ¿Debo eliminar manualmente el archivo de la temperatura una vez que se envía el correo? Si es así, ¿cómo?

+3

Finalmente lo clavé: 'unless (params [: mail] [: attachment]) nil? cargador = AttachmentUploader.new uploader.cache (params [: mail] [: adjunto])! @file_name = uploader.filename @file_data = uploader.file.read() end' y luego 'MyMailer.send_mail (@ file_name, @ file_data) ' – muichkine

+0

Si está listo para recapitular la solución como su propia respuesta, borraré mi respuesta. (Ver http://meta.stackexchange.com/questions/90263/unanswered-question-answered-in-comments para la explicación de por qué esto es útil.) ¡Gracias! – DreadPirateShawn

Respuesta

5

Copia de la respuesta de los comentarios con el fin de eliminar esta pregunta de la "sin respuesta" filtro:

Por último dado en el clavo:  

unless (params[:mail][:attachment]).nil? 
    uploader = AttachmentUploader.new 
    uploader.cache!(params[:mail][:attachment]) 
    @file_name = uploader.filename 
    @file_data = uploader.file.read() 
end 

y luego

MyMailer.send_mail(@file_name,@file_data) 

~ respuesta por user1563325

+0

¡Esto funcionó para mí! ¿Sabes cómo usaría el mismo método para múltiples archivos @DreadPirateShawn? Gracias por adelantado. – Les

0

Me gustaría agregar que para t El escenario descrito aquí, tal vez usted no necesita CarrierWave para una situación de carga temporal. Al cargar utilizando file_field, Rieles lo guarda en un Tempfile, cuya trayectoria se puede acceder de esta manera:

params[:mail][:attachment].path 

Estos archivos se eliminan automáticamente de modo que no es necesario que preocuparse de ellos, como el Rails docs explique:

Los archivos cargados son archivos temporales cuya vida útil es de una solicitud. Cuando el objeto está finalizado, Ruby desvincula el archivo, por lo que no es necesario limpiarlo con una tarea de mantenimiento separada.

Cuestiones relacionadas