2016-01-15 4 views
1

Le code suivant est destiné à agréger une poignée de documents PDF et envoyer un fichier zip avec tous les fichiers PDF contenus. Le code fonctionne, mais seulement 50% du temps.Tempfile compressé n'envoyant que la moitié du temps - en utilisant Rubyzip

def donor_reports 
@starting_date = params['date'].to_date 
@ending_date = @starting_date.to_date.end_of_month 
@categories = Category.all 
zipfile_name = Tempfile.new(['records', '.zip']) 
Zip::File.open(zipfile_name.path, Zip::File::CREATE) do |zipfile| 
    @categories.each do |category| 
    temp_pdf = Tempfile.new(['record', '.pdf']) 
    temp_pdf.binmode 
    temp_prawn_pdf = CategoryReport.new 
    temp_prawn_pdf.generate_report(category, @starting_date, @ending_date) 
    temp_pdf.write temp_prawn_pdf.render 
    temp_pdf.rewind 
    zipfile.add("#{category.name} - Donation Report.pdf", "#{temp_pdf.path}") 
    end 
end 
send_file zipfile_name 
end 

L'autre 50% du temps, il jette l'erreur suivante -

No such file or directory @ rb_sysopen - /var/folders/jy/w7tv9n8n7tqgtgmv49qz7zqh0000gn/T/record20160114-10768-1guyoar.pdf 

Tous les conseils/conseils ici serait très apprécié! Première fois en utilisant Tempfile et Rubyzip.

+0

Je n'ai pas une solution à ce (encore) mais je voulais vous dire que j'ai le même problème. C'est une question intermittente la plupart du temps. – user478798

Répondre

0

Ceci est probablement dû au fait que le Tempfile interne est récupéré et supprimé du disque (parfois) avant que la gemme ne fasse référence à la fin du bloc zipfile. Je viens de pousser ces derniers dans un tableau pour la contourner: `` `

temp_files = [] 
Zip::File.open(temp_file.path, Zip::File::CREATE) do |zip| 
    @categories.each do |category| 
     temp_pdf = Tempfile.new(['record', '.pdf']) 
     #... 
     temp_files << temp_pdf 
    end 
end 

` ``