如何在Rails中通过电子邮件发送自生成的csv文件而不保存它?

时间:2016-09-18 02:18:30

标签: ruby-on-rails csv heroku

在我的Rails应用程序中,我使用模型方法中的CSV.open块创建CSV文件。

class SomeModel
   def self.write_csv
      CSV.open("my_file_name.csv", "w") do |csv|
         ### inserts lines into the file ###
      end
   end
end

在我的控制器中,我有一个动作将文件发送到用户输入的电子邮件地址

def some_controller_method
   SomeModel.write_csv
   email = params[:email]

   JobMailer.send_csv(email).deliver
end

JobMailer中,我直接按文件名引用文件,因为CSV.open中的SomeModel.write_csv块将文件保存到主目录的磁盘上。

def send_csv(email)
    attachments['my_file_name.csv'] = {mime_type: 'text/csv', content: File.read(Rails.root.join('your_file.csv'))}
    mail(to: email, subject: 'My subject', body: 'My body.')
end

目前,当新的请求进入时,应用程序将重写该文件,我相信当我在Heroku上进行生产时,它会在一段时间后自动删除它。

回顾一下:

  1. 生成CSV
  2. 通过Mailer发送电子邮件
  3. 删除文件
  4. 这可以在不将其保存到磁盘的情况下完成吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:19)

您可以使用CSV#generate class method

class SomeModel
   def self.generate_csv
      CSV.generate do |csv|
         ### inserts lines into the file ###
      end
   end
end

def some_controller_method
   csv = SomeModel.generate_csv
   email = params[:email]

   JobMailer.send_csv(email, csv).deliver
end

def send_csv(email, csv)
    attachments['my_file_name.csv'] = {mime_type: 'text/csv', content: csv}
    mail(to: email, subject: 'My subject', body: 'My body.')
end