2012-09-07 4 views
5

Devo essere in grado di allegare un file a una posta (utilizzando Mailer) per un file caricato di recente che non è collegato a nessun modello.File temporaneo Carrierwave senza modello

Nel codice che va per il modulo di upload:

<%= 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!" %> 

Ora, quello che sto cercando a fare nell'azione send_mail è qualcosa di simile:

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

con params [: mail] [: allegato] è il percorso del file temporaneo caricato con il modulo. Come si può farlo?

Ciò implica anche un'altra domanda: dovrei cancellare manualmente il file dalla temp una volta inviata la posta? Se sì, come?

+3

Infine inchiodato: 'meno che (params [: mail] [: allegato]). Nil? uploader = AttachmentUploader.new uploader.cache (params [: mail] [: allegato])! @file_name = uploader.filename @file_data = uploader.file.read() FINE' e poi 'MyMailer.send_mail (@ nome_file, @ file_data) ' – muichkine

+0

Se sei un gioco per ricapitolare la soluzione come la tua risposta, cancellerò la mia risposta. (Vedi http://meta.stackexchange.com/questions/90263/unanswered-question-answered-in-comments per l'elaborazione del motivo per cui questo è utile.) Grazie! – DreadPirateShawn

risposta

5

Copiare la risposta dai commenti al fine di rimuovere questa domanda dal filtro "Senza risposta":

Infine inchiodato:  

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

e poi

MyMailer.send_mail(@file_name,@file_data) 

~ risposta per user1563325

+0

Questo ha funzionato per me! Sai come userei lo stesso metodo per più file @DreadPirateShawn? Grazie in anticipo. – Les

0

Vorrei aggiungere che per t Lo scenario descritto qui, forse non hai bisogno di CarrierWave per una situazione di caricamento temporanea. Durante il caricamento utilizza file_field, Rails salva in un Tempfile, il cui percorso è possibile accedere in questo modo:

params[:mail][:attachment].path 

Questi file vengono eliminati automaticamente, quindi non dovreste aver bisogno di preoccuparsi di loro, come il Rails docs spiegare:

I file caricati sono file temporanei la cui durata è una richiesta. Quando l'oggetto è finalizzato Ruby scollega il file, quindi non è necessario pulirli con un'attività di manutenzione separata.