view raw
BC00 BC00 - 1 year ago 45
Ruby Question

Ruby, Tempfile, Writing to csv

I have the below background job that writes to a csv file and emails it out. I am using the Tempfile class so the file is removed after I email it to the user. Currently, when I look at the csv file I am producing the results look like the following:

["Client Application" "Final Price" "Tax" "Credit" "Base Price" "Billed At" "Order Guid" "Method of Payment Guid" "Method of Payment Type"]
["web" nil nil nil nil nil nil "k32k313k1j3" "credit card"]

Please ignore the data, but the issue is, it is being written directly to the file in the ruby format and not removing the "" and [] characters...

Please see the code below:

class ReportJob
@queue = :report_job

def self.perform(client_app_id, current_user_id)
user = User.find(current_user_id)
client_application = Application.find(client_app_id)
transactions = client_application.transactions
file =["#{Rails.root}/tmp/", ".csv"]) do |csv|
csv << ["Application", "Price", "Tax", "Credit", "Base Price", "Billed At", "Order ID", "Payment ID", "Payment Type"]
transactions.each do |transaction|
csv << "\n"
csv << [, transaction.price,,, transaction.base_price, transaction.billed_at, transaction.order_id, transaction.payment_id, transaction.payment_type]
ReportMailer.send_rev_report(, csv).deliver


Would this be an issue with using the tempfile class instead of the csv class? or is there something I could do to change the way it is being written to the file? Any help is appreciated. Thank You!

Adding the code for reading the csv file in the mailer. I am currently getting a TypeError that says "can't convert CSV into String".

class ReportMailer < ActionMailer::Base
default :from => ""

def send_rev_report(email, file)
attachments['report.csv'] ="#{::Rails.root.join('tmp', file)}")
mail(:to => email, :subject => "Attached is your report")


The issue is that you're not actually writing csv data to the file. You're sending arrays to the filehandle. I believe you need something like: do |fh|
    csv =, ...)
    <rest of your code>

to properly setup the CSV output filtering.