4

对于最近上传的未链接到任何模型的文件,我需要能够将文件附加到邮件(使用 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 

params[:mail][:attachment] 是随表单上传的临时文件的路径。怎么可能做到这一点?

这也暗示了另一个问题:发送邮件后,我是否应该从临时文件中手动删除文件?如果是,如何?

4

2 回答 2

8

复制评论中的答案,以便从“未回答”过滤器中删除此问题:

终于搞定了: 

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)

〜回答每个用户1563325

于 2013-10-09T06:11:55.030 回答
0

对于此处描述的场景,我想补充一点,也许您不需要 CarrierWave 来处理这种临时上传情况。使用 上传时file_field,Rails 将其保存到Tempfile中,您可以像这样访问其路径:

params[:mail][:attachment].path

这些文件会自动删除,因此您不必担心它们,正如Rails 文档所解释的那样:

上传的文件是临时文件,其生命周期是一个请求。当对象最终确定时,Ruby 会取消链接文件,因此无需使用单独的维护任务来清理它们。

于 2017-12-31T01:02:59.863 回答