我需要能够将文件附加到邮件(使用Mailer)以获取最近上传的文件,该文件未链接到任何模型。
在上传表单的代码中:
<%= 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!" %>
现在,我在send_mail操作中所做的事情是:
MyMailer.send_mail(params[:mail][:attachment]).deliver
with params [:mail] [:attachment]是与表单一起上传的临时文件的路径。怎么能这样做?
这也意味着另一个问题:一旦发送邮件,我应该从temp手动删除文件吗?如果有,怎么样?
答案 0 :(得分:5)
从评论中复制答案,以便从“未答复”过滤器中删除此问题:
最后钉了它:
unless (params[:mail][:attachment]).nil?
uploader = AttachmentUploader.new
uploader.cache!(params[:mail][:attachment])
@file_name = uploader.filename
@file_data = uploader.file.read()
end
然后
MyMailer.send_mail(@file_name,@file_data)
回答
答案 1 :(得分:0)
我想补充一点,对于此处描述的场景,您可能不需要CarrierWave来实现这种临时上传情况。使用file_field
上传时,Rails会将其保存到Tempfile,其路径可以像这样访问:
params[:mail][:attachment].path
这些文件会自动删除,因此您无需担心,Rails docs解释:
上传的文件是临时文件,其生命周期是一个请求。当对象完成后,Ruby取消链接文件,因此不需要使用单独的维护任务来清理它们。